Bcellmagic analysis pipeline

Pipeline overview

Number of sequences

Number of reads for each of the samples and number of sequences left after representative analysis steps.

ID Source Treatment Extraction_time Population Sequences_R1 Sequences_R2 Filtered_quality_R1 Filtered_quality_R2 Mask_primers_R1 Mask_primers_R2 Paired Build_consensus Assemble_pairs Unique Representative_2 Igblast
QMKMK229AC CLAD1B Cladribin baseline DN 1001901 1001901 998230 929323 950964 889152 874759 523735 90355 59292 8473 6791
QMKMK230AF CLAD1B Cladribin baseline N 601885 601885 599360 566181 571750 543140 533806 402066 97532 92699 6384 4471
QMKMK231AN CLAD1B Cladribin baseline M 1036290 1036290 1033363 964197 980082 919636 904197 780526 135769 124173 4958 4670
QMKMK232AV CLAD1B Cladribin baseline P 1352414 1352414 1346800 1262235 1290104 1212304 1196447 939219 149869 130718 7715 6761
QMKMK233A5 CLAD1C Cladribin 6months DN 1223690 1223690 1218476 1135468 1160160 1085218 1067347 791259 164345 121161 12723 11199
QMKMK234AD CLAD1C Cladribin 6months N 577697 577697 574852 539847 539088 508859 500228 385785 89640 88086 4824 3042
QMKMK235AL CLAD1C Cladribin 6months M 801072 801072 799337 750714 761523 718534 706606 608541 111207 95243 4519 4087
QMKMK236AT CLAD1C Cladribin 6months P 2043123 2043123 2033938 1877437 1930800 1784871 1761332 1235841 181411 160569 15490 13604
QMKMK241AU CLAD1D Cladribin 12months DN 1857453 1857453 1847028 1701105 1709731 1569714 1550126 857643 153793 117453 14307 11728
QMKMK242A4 CLAD1D Cladribin 12months M 1850771 1850771 1846857 1708178 1770918 1632432 1611884 1280996 217152 195283 10504 7908
QMKMK243AC CLAD1D Cladribin 12months N 1244736 1244736 1242282 1135476 1178264 1075176 1059637 679954 139280 136735 15418 4904
QMKMK244AK CLAD1D Cladribin 12months P 1811754 1811754 1807946 1664568 1739221 1597527 1577659 1079476 254312 209764 21119 17531
QMKMK533AN CLAD2B Cladribin baseline N 299299 299299 298776 284644 278650 263896 259773 136538 42888 21024 3065 2478
QMKMK534AV CLAD2B Cladribin baseline M 911354 911354 909208 856360 853308 802774 789542 619034 99507 87314 6089 5676
QMKMK535A5 CLAD2B Cladribin baseline DN 1548122 1548122 1546518 1485086 1455661 1392202 1373849 746018 162418 91819 14290 12021
QMKMK536AD CLAD2B Cladribin baseline P 828075 828075 826764 781959 769833 729669 715212 583392 116702 101158 7315 7063
QMKMK537AL CLAD2C Cladribin 6months N 1695948 1695948 1695010 1636672 1564060 1506398 1482971 541493 162342 145709 25033 10018
QMKMK538AT CLAD2C Cladribin 6months M 2467900 2467900 2466808 2356982 2309769 2200497 2169463 767598 187811 126228 19933 17408
QMKMK539A3 CLAD2C Cladribin 6months DN 1670407 1670407 1669498 1608729 1548656 1486886 1464870 472354 119636 57321 9888 8395
QMKMK540A6 CLAD2C Cladribin 6months P 1418658 1418658 1417830 1366294 1320682 1272534 1251506 771396 206753 144571 18111 16220
QMKMK541AE CLAD2D Cladribin 12months N 1254799 1254799 1253722 1212466 1174117 1107772 1090535 522116 180332 174805 16652 7429
QMKMK542AM CLAD2D Cladribin 12months M 2480119 2480119 2478403 2372338 2315848 2199929 2166193 1126337 265733 232683 15946 13289
QMKMK543AU CLAD2D Cladribin 12months DN 1492340 1492340 1491521 1430650 1373414 1309222 1288903 743613 187691 140125 15719 12861
QMKMK544A4 CLAD2D Cladribin 12months P 1104002 1104002 1103382 1063497 1036043 994570 979051 493551 147757 93526 13522 11413
QMKMK545AC CLAD3B Cladribin baseline N 1571620 1571620 1570771 1523584 1497824 1451341 1431781 543131 171670 143580 26461 14093
QMKMK546AK CLAD3B Cladribin baseline M 1798031 1798031 1796794 1739586 1712984 1656005 1636655 1007055 254909 229384 13572 12353
QMKMK547AS CLAD3B Cladribin baseline DN 1325826 1325826 1324051 1277183 1262297 1218805 1199399 629789 146170 105951 13941 11564
QMKMK548A2 CLAD3B Cladribin baseline P 1375460 1375460 1374152 1327752 1308934 1264258 1245115 730531 161037 141148 13243 12400
QMKMK549AA CLAD3C Cladribin 6months N 1385899 1385899 1385012 1335147 1305595 1255991 1239376 490510 158561 140711 30700 13134
QMKMK550AD CLAD3C Cladribin 6months M 1240876 1240876 1240142 1207393 1183864 1149887 1136654 681733 204625 143603 17405 15518
QMKMK551AL CLAD3C Cladribin 6months DN 261349 261349 260058 244972 215326 231145 197023 176276 32322 19154 2452 1428
QMKMK552AT CLAD3C Cladribin 6months P 235034 235034 234857 229626 224030 219497 216216 172572 77444 53394 7446 7258
QMKMK553A3 CLAD3D Cladribin 12months N 1591756 1591756 1590676 1540766 1517741 1464383 1445065 515304 173695 149072 28652 15265
QMKMK554AB CLAD3D Cladribin 12months M 1564019 1564019 1562831 1507023 1492048 1428178 1411785 779001 213213 166219 19734 15267
QMKMK555AJ CLAD3D Cladribin 12months DN 111483 111483 111312 107140 103242 100959 97245 85541 42105 30219 5062 4850
QMKMK556AR CLAD3D Cladribin 12months P 155013 155013 154892 151406 146876 144291 141167 87747 48027 25315 4504 4231
QMKMK557A1 CLAD4C Cladribin 6months N 1398965 1398965 1392433 1294121 1330529 1238996 1220960 745805 129053 123154 9745 4513
QMKMK558A9 CLAD4C Cladribin 6months M 1374928 1374928 1368571 1237182 1305056 1178785 1164891 979677 141172 122743 6397 5864
QMKMK559AH CLAD4C Cladribin 6months DN 2409179 2409179 2398262 2172405 2301729 2083291 2058484 1124294 196875 154806 19607 16828
QMKMK560AK CLAD4C Cladribin 6months P 1068173 1068173 1064298 978142 1021878 940132 928637 709471 170037 146347 9105 8546
QMKMK561AS CLAD4B Cladribin baseline N 1641107 1641107 1576042 1345005 1477248 1274519 1229456 874313 68882 67175 2443 132
QMKMK562A2 CLAD4B Cladribin baseline M 1385399 1385399 1379705 1250203 1320361 1196503 1179563 962388 157539 143239 7104 6066
QMKMK563AA CLAD4B Cladribin baseline DN 2589345 2589345 2576384 2318103 2466634 2218225 2186658 1244924 195807 163855 20592 16886
QMKMK564AI CLAD4B Cladribin baseline P 1801823 1801823 1794104 1626149 1707738 1549822 1527755 970295 139582 117106 10528 9215
QMKMK565AQ CLAD4D Cladribin 12months N 1233912 1233912 1227233 1127439 1171418 1074382 1058954 706029 124862 119937 8170 4154
QMKMK566A0 CLAD4D Cladribin 12months M 1519136 1519136 1511801 1377911 1458300 1325813 1307238 1038900 165094 139608 10051 9029
QMKMK567A8 CLAD4D Cladribin 12months DN 1084835 1084835 1077309 963006 985191 874572 862952 641428 113520 106915 8246 4478
QMKMK568AG CLAD4D Cladribin 12months P 1322433 1322433 1317876 1210528 1271272 1164834 1150760 665752 151153 105446 9344 7211
QMKMK569AO CLAD5B Cladribin baseline N 1447197 1447197 1445335 1373651 1337298 1269719 1252608 619525 174483 158367 18757 6711
QMKMK570AR CLAD5B Cladribin baseline M 1468661 1468661 1466765 1367672 1319151 1225178 1209652 893529 189690 167979 7970 6680
QMKMK571A1 CLAD5B Cladribin baseline DN 1126741 1126741 1125031 1062795 1031127 971370 960077 512020 112117 70506 9255 6407
QMKMK572A9 CLAD5B Cladribin baseline P 1397460 1397460 1396014 1316108 1290285 1214297 1199625 843531 178334 134204 12207 10850
QMKMK573AH CLAD5C Cladribin 6months N 1329042 1329042 1326871 1258667 1193608 1129648 1114054 535460 159472 147245 17033 5721
QMKMK574AP CLAD5C Cladribin 6months M 1237833 1237833 1236499 1162554 1137697 1066878 1053987 813652 164645 137354 6905 6396
QMKMK575AX CLAD5C Cladribin 6months DN 1383178 1383178 1381643 1296415 1266158 1181512 1167639 852504 190751 173985 7869 5721
QMKMK576A7 CLAD5C Cladribin 6months P 1262705 1262705 1261244 1179067 1143706 1064972 1051693 793721 206575 171237 10787 9634
QMKMK577AF CLAD5D Cladribin 12months N 1351967 1351967 1350771 1280959 1243575 1172545 1156655 527186 156410 144944 15828 5310
QMKMK578AN CLAD5D Cladribin 12months M 713600 713600 712818 676328 667632 628686 622159 517446 126348 101977 4161 3828
QMKMK579AV CLAD5D Cladribin 12months DN 2456014 2456014 2451084 2269903 2141182 1958202 1938322 660014 132908 86960 14236 11742
QMKMK580A0 CLAD5D Cladribin 12months P 834969 834969 834181 787283 779041 731399 722664 580601 147105 115414 6573 6144
QMKMK581A8 CLAD6B Cladribin baseline N 1001206 1001206 1000860 970356 962940 936587 920818 443222 140229 86143 18836 12878
QMKMK582AG CLAD6B Cladribin baseline M 1283684 1283684 1283183 1244329 1236314 1203407 1184237 788066 169359 149750 15319 14341
QMKMK583AO CLAD6B Cladribin baseline DN 1097528 1097528 1096978 1066751 1063618 1033309 1021656 634968 162236 105873 17898 16467
QMKMK584AW CLAD6B Cladribin baseline P 1016627 1016627 1016172 988801 984990 962146 947239 442684 163958 76798 20099 18856
QMKMK585A6 CLAD6C Cladribin 6months N 1285504 1285504 1285176 1251705 1229806 1201931 1182778 543798 171993 148550 28207 18305
QMKMK586AE CLAD6C Cladribin 6months M 1330009 1330009 1329416 1292399 1284875 1253526 1233148 891219 225138 195468 18430 16976
QMKMK587AM CLAD6C Cladribin 6months DN 1242825 1242825 1240467 1197808 1200344 1156147 1137148 654652 192553 126264 26230 24527
QMKMK588AU CLAD6C Cladribin 6months P 1002045 1002045 1001430 967754 965269 932794 921632 434166 147296 84074 18889 16981
QMKMK589A4 CLAD6D Cladribin 12months N 1137999 1137999 1137344 1103323 1097509 1066778 1049119 462124 140909 135523 21101 13153
QMKMK590A7 CLAD6D Cladribin 12months M 1209002 1209002 1208461 1171649 1172398 1134117 1117971 734223 260961 216294 24198 22100
QMKMK591AF CLAD6D Cladribin 12months DN 1197736 1197736 1197184 1151818 1136481 1087259 1076116 597055 230367 158143 28593 25805
QMKMK592AN CLAD6D Cladribin 12months P 992655 992655 992309 965445 964234 935022 924219 613741 189846 142596 19689 18072
QMKMK593AV CLAD7B Cladribin baseline N 1072973 1072973 1072013 1039366 988048 953478 940620 440559 133366 110801 16443 7777
QMKMK594A5 CLAD7B Cladribin baseline M 1840517 1840517 1838589 1774842 1701120 1635963 1614648 951548 227994 188708 14404 12974
QMKMK595AD CLAD7B Cladribin baseline DN 1440796 1440796 1438064 1373169 1336916 1271791 1252865 628762 132142 78579 11111 9215
QMKMK596AL CLAD7B Cladribin baseline P 1677725 1677725 1676137 1618758 1542366 1484679 1464832 759840 228680 135179 19621 17044
QMKMK597AT CLAD7C Cladribin 6months N 1239270 1239270 1237713 1198319 1123326 1081563 1066953 497750 144787 123197 13744 7293
QMKMK598A3 CLAD7C Cladribin 6months M 1298404 1298404 1297197 1252956 1196708 1145838 1133594 718356 193453 162679 15845 12137
QMKMK599AB CLAD7C Cladribin 6months DN 1254978 1254978 1253336 1203733 1142735 1087229 1075266 641336 171226 151010 14466 9894
QMKMK600AI CLAD7C Cladribin 6months P 1479917 1479917 1470919 1412765 1358861 1304396 1281664 714214 66258 62212 3085 1416
QMKMK601AQ CLAD7D Cladribin 12months N 1149545 1149545 1148532 1113085 1063607 1023791 1009898 423785 141212 121700 15720 8170
QMKMK602A0 CLAD7D Cladribin 12months M 1939178 1939178 1936601 1866139 1800331 1717691 1698002 1106596 245524 189692 17130 15296
QMKMK603A8 CLAD7D Cladribin 12months DN 1545739 1545739 1541982 1470482 1406198 1325331 1310600 517286 81954 48825 7513 6120
QMKMK604AG CLAD7D Cladribin 12months P 1211943 1211943 1210523 1172308 1132847 1087549 1075259 486519 138916 90523 13014 10489
QMKMK605AO CLAD8B Cladribin baseline N 1444889 1444889 1444445 1385795 1385248 1321867 1304667 533331 155798 139077 20015 6758
QMKMK606AW CLAD8B Cladribin baseline M 1703561 1703561 1701051 1643939 1631017 1568457 1549559 1091551 151426 140107 8872 5779
QMKMK607A6 CLAD8B Cladribin baseline DN 1108324 1108324 1107613 1067244 1061080 1015816 1004178 528411 115796 81992 8232 6778
QMKMK608AE CLAD8B Cladribin baseline P 1540452 1540452 1539639 1477308 1482318 1412976 1397948 991925 207542 162117 13883 12397
QMKMK609AM CLAD8C Cladribin 6months N 834333 834333 834049 798958 780110 742394 733064 418238 125716 105779 11087 5614
QMKMK610AP CLAD8C Cladribin 6months M 1106235 1106235 1104644 1054961 1057632 1004099 991576 776744 157852 130084 6879 6471
QMKMK611AX CLAD8C Cladribin 6months DN 1303870 1303870 1303135 1240914 1243559 1172185 1160462 730474 200257 157492 15955 11884
QMKMK612A7 CLAD8C Cladribin 6months P 968338 968338 967925 925579 923220 878144 867982 661726 189758 152494 10350 8882
QMKMK613AF CLAD8D Cladribin 12months N 1798683 1798683 1798081 1723011 1727265 1641478 1620069 633212 173678 154777 21448 8049
QMKMK614AN CLAD8D Cladribin 12months M 1186393 1186393 1185783 1139636 1142249 1085053 1073036 752119 179325 153197 8280 7679
QMKMK615AV CLAD8D Cladribin 12months DN 1407945 1407945 1407291 1342821 1314510 1238663 1225435 715692 188866 157712 12273 9193
QMKMK616A5 CLAD8D Cladribin 12months P 1029639 1029639 1029226 988857 995363 947316 936477 661648 182340 158080 7835 7172

Plotting number of unique sequences

Plotting number of representative 2 sequences

Plotting number of Igblast identified sequences

Clonal abundance

For plotting the clonal abundance, the clones were ordered by size from bigger clones to smaller clones (x-axis, Rank). The Abundance of each clone was represented as the percentage of unique sequences in the clone, with respect to the total number of unique sequences in that subject (By Patient) or in the B-cell or T-cell sample (By Cell Population).

To correct for the different number of sequences in each of the samples, the Bootstrapping technique was employed, in which 200 random bootstrap samples were taken, with size the number of sequences in the sample with less sequences (N). The solid line shows the mean Abundance of the bootstrap samples, whereas the transparent area shows the full Abundance range of the bootstrap samples.

All clonal abundance plots and tables with abundance values can be found under repertoire_analysis/Abundance.

Clonal abundance per subject

Count clones per subject

Clonal abundance per cell population

If different types of B-cell or T-cell populations are provided, here the clonal abundance is plotted for each patient and B / T-cell population.

Count clones per population

Clonal diversification index

Count clones per population

Clonal diversity

The clonal diversity \(D\) of the repertoire was calculated according to the general formula of Hill Diversity numbers:

\[ \begin{aligned} ^{q}D = \left( \sum_{i=1}^Rp_i^q \right)^{1/(1-q)} \end{aligned} \]

where:

At \(q=1\) the function is undefined and the limit to zero equals the exponential of the Shannon Entropy:

\[ \begin{aligned} ^{1}D = exp \left( \sum_{i=1}^Rp_i ln(p_i) \right) \end{aligned} \]

The intuition about the different Hill Diversity values is the following:

All clonal diversity plots and tables with diversity values can be found under repertoire_analysis/Diversity. To correct for the different number of sequences in each of the samples, the Bootstrapping technique was employed, in which 200 random bootstrap samples were taken, with size the number of sequences in the sample with less sequences (N). The solid line shows the mean Diversity of the bootstrap samples, whereas the transparent area shows the full Diversity range of the bootstrap samples.

Clonal diversity per subject

Clonal diversity at specific q values

q=1

q=0

Clonal diversity per cell population

Clonal diversity per population at specific q values

q=1

q=0

Figure diversity and abundance metrics

cannot compute exact p-value with zeroescannot compute exact p-value with zeroescannot compute exact p-value with zeroescannot compute exact p-value with tiescannot compute exact p-value with zeroescannot compute exact p-value with zeroes

cannot compute exact p-value with zeroescannot compute exact p-value with zeroescannot compute exact p-value with zeroescannot compute exact p-value with tiescannot compute exact p-value with zeroescannot compute exact p-value with zeroes

V gene usage

V gene family usage

The V gene usage (in percentage) in each of the samples is represented below. All plots and tables can be found here.

Gene family usage is normalized by the number of clones.

By patient

By Population

There were 27 warnings (use warnings() to see them)

V gene usage

The V gene usage (in percentage) in each of the samples is represented below. All plots and tables can be found here.

By clones

By sequences

Isotype usage

Isotype usage per subject

Isotype usage per cell population

`summarise()` has grouped output by 'isotype', 'sample_pop', 'source', 'treatment', 'extract_time'. You can override using the `.groups` argument.

Citations

If you use nf-core/bcellmagic for your analysis, please cite it using the following DOI: 10.5281/zenodo.3607408

Please also cite the nf-core publication (P. A. Ewels et al. 2020).

In addition, citations for the tools and data used in this pipeline are as follows:

Andrews, Simon et al. 2010. “FastQC: A Quality Control Tool for High Throughput Sequence Data.”
Ewels, Philip A., Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso, and Sven Nahnsen. 2020. “The Nf-Core Framework for Community-Curated Bioinformatics Pipelines.” Nature Biotechnology 38 (3): 276–78. https://doi.org/10.1038/s41587-020-0439-x.
Ewels, Philip, Måns Magnusson, Sverker Lundin, and Max Käller. 2016. “MultiQC: Summarize Analysis Results for Multiple Tools and Samples in a Single Report.” Bioinformatics 32 (19): 3047–48.
Gadala-Maria, Daniel, Gur Yaari, Mohamed Uduman, and Steven H. Kleinstein. 2015. “Automated Analysis of High-Throughput b-Cell Sequencing Data Reveals a High Frequency of Novel Immunoglobulin v Gene Segment Alleles.” Proceedings of the National Academy of Sciences of the United States of America 112 (8): E862–870. https://doi.org/10.1073/pnas.1417683112.
Gupta, Namita T., Jason A. Vander Heiden, Mohamed Uduman, Daniel Gadala-Maria, Gur Yaari, and Steven H. Kleinstein. 2015. “Change-o: A Toolkit for Analyzing Large-Scale b Cell Immunoglobulin Repertoire Sequencing Data.” Bioinformatics 31 (20): 3356–58. https://doi.org/10.1093/bioinformatics/btv359.
Stern, Joel N. H., Gur Yaari, Jason A. Vander Heiden, George Church, William F. Donahue, Rogier Q. Hintzen, Anita J. Huttner, et al. 2014. “B Cells Populating the Multiple Sclerosis Brain Mature in the Draining Cervical Lymph Nodes.” Science Translational Medicine 6 (248). https://doi.org/10.1126/scitranslmed.3008879.
Vander Heiden, Jason A., Gur Yaari, Mohamed Uduman, Joel N. H. Stern, Kevin C. O’Connor, David A. Hafler, Francois Vigneault, and Steven H. Kleinstein. 2014. “pRESTO: A Toolkit for Processing High-Throughput Sequencing Raw Reads of Lymphocyte Receptor Repertoires.” Bioinformatics 30 (13): 1930–32. https://doi.org/10.1093/bioinformatics/btu138.
LS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFibGUgb2YgY29udGVudHMKICAgIHRvY19mbG9hdDogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAjIGZsb2F0IHRoZSB0YWJsZSBvZiBjb250ZW50cyB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiBkb2N1bWVudCBjb250ZW50CiAgICB0b2NfZGVwdGg6IDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoZWFkZXIgbGV2ZWxzIDEsMiwzCiAgICB0aGVtZTogZGVmYXVsdAogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZSAgICAgICAgICAgICAgICAgICMgYWRkIHNlY3Rpb24gbnVtYmVyaW5nIHRvIGhlYWRlcnMKICAgIGRmX3ByaW50OiBwYWdlZCAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhYmxlcyBhcmUgcHJpbnRlZCBhcyBhbiBodG1sIHRhYmxlIHdpdGggc3VwcG9ydCBmb3IgcGFnaW5hdGlvbiBvdmVyIHJvd3MgYW5kIGNvbHVtbnMKICAgIGNzczogLi9uZi1jb3JlX3N0eWxlLmNzcwogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgcGRmX2RvY3VtZW50OiB0cnVlCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCmJpYmxpb2dyYXBoeTogLi9yZWZlcmVuY2VzLmJpYnRleAotLS0KCgotLS0KdGl0bGU6ICJSZXBlcnRvaXJlIGFuYWx5c2lzIgpzdWJ0aXRsZTogIkNsb25hbCBhYnVuZGFuY2UsIGRpdmVyc2l0eSBhbmQgVi1mYW1pbHkgZ2VuZSB1c2FnZSIKZGF0ZTogJ2ByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJUIgJWQsICVZIilgJwpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShkcGx5cikKbGlicmFyeShhbGFrYXphbSkKbGlicmFyeShzaGF6YW0pCmxpYnJhcnkoc3RyaW5ncikKCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ3Bsb3RzKQpsaWJyYXJ5KGNpcmNsaXplKQpsaWJyYXJ5KFVwU2V0UikKbGlicmFyeShndG9vbHMpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGNvd3Bsb3QpCgp0aGVtZV9zZXQodGhlbWVfYncoYmFzZV9mYW1pbHkgPSAiQXJpYWxNVCIpICsKICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHk9IkFyaWFsTVQiKSkpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoqKioKCiMgQmNlbGxtYWdpYyBhbmFseXNpcyBwaXBlbGluZQoKIyMgUGlwZWxpbmUgb3ZlcnZpZXcKCiMjIE51bWJlciBvZiBzZXF1ZW5jZXMKCk51bWJlciBvZiByZWFkcyBmb3IgZWFjaCBvZiB0aGUgc2FtcGxlcyBhbmQgbnVtYmVyIG9mIHNlcXVlbmNlcyBsZWZ0IGFmdGVyIHJlcHJlc2VudGF0aXZlIGFuYWx5c2lzIHN0ZXBzLgoKYGBge3Igc2VxX251bWJlcnMsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojVE9ETyByZWFkIFRhYmxlIHNlcXVlbmNlcwp0YWJfc2VxcyA8LSByZWFkLnRhYmxlKCIuLi8uLi9waXBlbGluZV9yZXN1bHRzX3Blcl90aW1lcG9pbnQvcGFyc2VkX2xvZ3Mvc2VxdWVuY2VzX3RhYmxlL1RhYmxlX3NlcXVlbmNlc19wcm9jZXNzLnRzdiIsIGhlYWRlcj1UUlVFLCBzZXA9Ilx0IiwgY2hlY2submFtZXMgPSBGQUxTRSkKa2FibGUodGFiX3NlcXMpICU+JQogICAga2FibGVfc3R5bGluZygiaG92ZXIiKSAlPiUKICAgIHNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICI0MDBweCIpCmBgYAoKUGxvdHRpbmcgbnVtYmVyIG9mIHVuaXF1ZSBzZXF1ZW5jZXMKCmBgYHtyIHNlcV9udW1iZXJzX3Bsb3RfdW5pcXVlLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBlY2hvPUZBTFNFfQp0YWJfc2VxcyRFeHRyYWN0aW9uX3RpbWUgPC0gZmFjdG9yKHRhYl9zZXFzJEV4dHJhY3Rpb25fdGltZSwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCmc0IDwtIGdncGxvdCh0YWJfc2VxcywgYWVzKGZpbGw9RXh0cmFjdGlvbl90aW1lLCB5PVVuaXF1ZSwgeD1Qb3B1bGF0aW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlcXVlbmNlIG51bWJlciIpICsKICBnZ3RpdGxlKCJVbmlxdWUgc2VxdWVuY2UgbnVtYmVycyBwZXIgc2FtcGxlIikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKFNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApgYGAKCgpQbG90dGluZyBudW1iZXIgb2YgcmVwcmVzZW50YXRpdmUgMiBzZXF1ZW5jZXMKCmBgYHtyIHNlcV9udW1iZXJzX3Bsb3RfcmVwMiwgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuMywgZWNobz1GQUxTRX0KZzQgPC0gZ2dwbG90KHRhYl9zZXFzLCBhZXMoZmlsbD1FeHRyYWN0aW9uX3RpbWUsIHk9UmVwcmVzZW50YXRpdmVfMiwgeD1Qb3B1bGF0aW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlcXVlbmNlIG51bWJlciIpICsKICBnZ3RpdGxlKCJSZXByZXNlbnRhdGl2ZTIgc2VxdWVuY2UgbnVtYmVycyBwZXIgc2FtcGxlIikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKFNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApgYGAKCgpQbG90dGluZyBudW1iZXIgb2YgSWdibGFzdCBpZGVudGlmaWVkIHNlcXVlbmNlcwoKCmBgYHtyIHNlcV9udW1iZXJzX3Bsb3QsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjMsIGVjaG89RkFMU0V9Cmc0IDwtIGdncGxvdCh0YWJfc2VxcywgYWVzKGZpbGw9RXh0cmFjdGlvbl90aW1lLCB5PUlnYmxhc3QsIHg9UG9wdWxhdGlvbikpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJTZXF1ZW5jZSBudW1iZXIiKSArCiAgZ2d0aXRsZSgiSWdibGFzdCBpZGVudGlmaWVkIHNlcXVlbmNlIG51bWJlciBwZXIgc2FtcGxlIikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKFNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApgYGAKCgoKYGBge3IgcmVhZF9kYXRhLCBpbmNsdWRlPUZBTFNFfQojIFJlYWRpbmcgZGF0YSB0YWJsZXMgYW5kIGNlYXRpbmcgb3V0cHV0IGZvbGRlcnMKI2RhdGFkaXIgPC0gIi4iCm91dGRpciA8LSAicmVwZXJ0b2lyZV9jb21wYXJpc29uX3RwIgojIHNldHdkIHRvIHJlc3VsdHMgZm9sZGVyIChjb250YWluaW5nIGFsYWthemFtLCBzaGF6YW0sIGV0Yy4gZm9sZGVycykKIyMjIFJlYWQgYWxsIHRoZSB0YWJsZXMgYXMgcHJvZHVjZWQgYnkgdGhlIHBpcGVsaW5lIGluIHRoZSBjdXJyZW50IGZvbGRlciBhbmQgam9pbnMgdGhlbSB0b2dldGhlciBpbiB0aGUgZGZfYWxsIGRhdGFmcmFtZQojYWxsX2ZpbGVzIDwtIHN5c3RlbShwYXN0ZTAoImZpbmQgJyIsZGF0YWRpciwiJyAtbmFtZSAnKmdlcm0tcGFzcy50c3YnIiksIGludGVybj1UKQpkaXIuY3JlYXRlKG91dGRpcikKZGl2ZXJzaXR5X2RpciA8LSBwYXN0ZShvdXRkaXIsICJEaXZlcnNpdHkiLCBzZXA9Ii8iKQphYnVuZGFuY2VfZGlyIDwtIHBhc3RlKG91dGRpciwgIkFidW5kYW5jZSIsIHNlcD0iLyIpCnZmYW1pbHlfZGlyIDwtIHBhc3RlKG91dGRpciwgIlZfZmFtaWx5Iiwgc2VwPSIvIikKaXNvdHlwZV9kaXIgPC0gcGFzdGUob3V0ZGlyLCAiSXNvdHlwZSIsIHNlcD0iLyIpCmRpci5jcmVhdGUoZGl2ZXJzaXR5X2RpcikKZGlyLmNyZWF0ZShhYnVuZGFuY2VfZGlyKQpkaXIuY3JlYXRlKHZmYW1pbHlfZGlyKQpkaXIuY3JlYXRlKGlzb3R5cGVfZGlyKQojIEdlbmVyYXRlIG9uZSBiaWcgZGF0YWZyYW1lIGZyb20gYWxsIHBhdGllbnQgZGF0YWZyYW1lcwojZGZfYWxsID0gZGF0YS5mcmFtZSgpCiNmb3IgKGZpbGUgaW4gYWxsX2ZpbGVzKXsKIyAgICBmbmFtZSA9IGZpbGUKIyAgICBwcmludChmbmFtZSkKIyAgICBkZl9wYXQgPC0gcmVhZC5jc3YoZm5hbWUsIHNlcD0iXHQiKQojICAgIGRmX2FsbCA8LSByYmluZChkZl9hbGwsIGRmX3BhdCkKI30KI3dyaXRlLnRhYmxlKGRmX2FsbCwgcGFzdGUwKG91dGRpciwiL2FsbF9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZT1GLCByb3cubmFtZXMgPSBGLCBjb2wubmFtZXMgPSBUKQpkZl9hbGwgPC0gcmVhZC5jc3YoIi4uLy4uL3BpcGVsaW5lX3Jlc3VsdHNfcGVyX3RpbWVwb2ludC9yZXBlcnRvaXJlX2FuYWx5c2lzL3JlcGVydG9pcmVfY29tcGFyaXNvbi9hbGxfZGF0YS50c3YiLCBzZXA9Ilx0IikKCiMgUmVtb3ZlIHVuZGVyc2NvcmVzIGluIHRoZXNlIGNvbHVtbnMKZGZfYWxsJHRyZWF0bWVudCA8LSBzYXBwbHkoZGZfYWxsJHRyZWF0bWVudCwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHNvdXJjZSA8LSBzYXBwbHkoZGZfYWxsJHNvdXJjZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJGV4dHJhY3RfdGltZSA8LSBzYXBwbHkoZGZfYWxsJGV4dHJhY3RfdGltZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2FsbCRwb3B1bGF0aW9uLCBmdW5jdGlvbih4KSBzdHJfcmVwbGFjZShhcy5jaGFyYWN0ZXIoeCksICJfIiwgIiIpKQoKZGZfYWxsJHNvdXJjZSA8LSBzYXBwbHkoZGZfYWxsJHNvdXJjZSwgZnVuY3Rpb24oeCkgc3Vic3RyaW5nKGFzLmNoYXJhY3Rlcih4KSwxLDUpKQoKIyBBbm5vdGF0ZSBzYW1wbGUgYW5kIHNhbXBsZXBvcCAoc2FtcGxlICsgcG9wdWxhdGlvbikgYnkgYWRkIGluZyBhbGwgdGhlIGNvbmRpdGlvbnMKZGZfYWxsJHNhbXBsZSA8LSBhcy5mYWN0b3IocGFzdGUoZGZfYWxsJHRyZWF0bWVudCwgZGZfYWxsJGV4dHJhY3RfdGltZSwgZGZfYWxsJHNvdXJjZSwgc2VwPSJfIikpCmRmX2FsbCRzYW1wbGVfcG9wIDwtIGFzLmZhY3RvcihwYXN0ZShkZl9hbGwkdHJlYXRtZW50LCBkZl9hbGwkZXh0cmFjdF90aW1lLCBkZl9hbGwkc291cmNlLCBkZl9hbGwkcG9wdWxhdGlvbiwgc2VwPSJfIikpCiMgU2V0IG51bWJlciBvZiBib290cnN0cmFwcwpuYm9vdCA9IDIwMAoKIyBSZW1vdmluZyBDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIGJlY2F1c2Ugb2YgdG9vIGxpdHRsZSBzZXF1ZW5jZXMKZGZfYWxsIDwtIGRmX2FsbFshKGRmX2FsbCRzYW1wbGVfcG9wPT0iQ2xhZHJpYmluX2Jhc2VsaW5lX0NMQUQ0X04iKSxdCgpgYGAKCiMgQ2xvbmFsIGFidW5kYW5jZQoKRm9yIHBsb3R0aW5nIHRoZSBjbG9uYWwgYWJ1bmRhbmNlLCB0aGUgY2xvbmVzIHdlcmUgb3JkZXJlZCBieSBzaXplIGZyb20gYmlnZ2VyIGNsb25lcyB0byBzbWFsbGVyIGNsb25lcyAoeC1heGlzLCBSYW5rKS4KVGhlIEFidW5kYW5jZSBvZiBlYWNoIGNsb25lIHdhcyByZXByZXNlbnRlZCBhcyB0aGUgcGVyY2VudGFnZSBvZiB1bmlxdWUgc2VxdWVuY2VzIGluIHRoZSBjbG9uZSwgd2l0aCByZXNwZWN0IHRvIHRoZSB0b3RhbApudW1iZXIgb2YgdW5pcXVlIHNlcXVlbmNlcyBpbiB0aGF0IHN1YmplY3QgKEJ5IFBhdGllbnQpIG9yIGluIHRoZSBCLWNlbGwgb3IgVC1jZWxsIHNhbXBsZSAoQnkgQ2VsbCBQb3B1bGF0aW9uKS4KClRvIGNvcnJlY3QgZm9yIHRoZSBkaWZmZXJlbnQgbnVtYmVyIG9mIHNlcXVlbmNlcyBpbiBlYWNoIG9mIHRoZSBzYW1wbGVzLCB0aGUgQm9vdHN0cmFwcGluZyB0ZWNobmlxdWUgd2FzIGVtcGxveWVkLAppbiB3aGljaCBgciBuYm9vdGAgcmFuZG9tIGJvb3RzdHJhcCBzYW1wbGVzIHdlcmUgdGFrZW4sIHdpdGggc2l6ZSB0aGUgbnVtYmVyIG9mIHNlcXVlbmNlcyBpbiB0aGUgc2FtcGxlIHdpdGggbGVzcyBzZXF1ZW5jZXMgKE4pLgpUaGUgc29saWQgbGluZSBzaG93cyB0aGUgbWVhbiBBYnVuZGFuY2Ugb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGVzLCB3aGVyZWFzIHRoZSB0cmFuc3BhcmVudCBhcmVhIHNob3dzIHRoZSBmdWxsIEFidW5kYW5jZQpyYW5nZSBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsZXMuCgpBbGwgY2xvbmFsIGFidW5kYW5jZSBwbG90cyBhbmQgdGFibGVzIHdpdGggYWJ1bmRhbmNlIHZhbHVlcyBjYW4gYmUgZm91bmQgdW5kZXIgYHJlcGVydG9pcmVfYW5hbHlzaXMvQWJ1bmRhbmNlYC4KCiMjIENsb25hbCBhYnVuZGFuY2UgcGVyIHN1YmplY3QKYGBge3IgY2xvbmFsX2FidW5kYW5jZSwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KYWJ1bmQgPC0gZXN0aW1hdGVBYnVuZGFuY2UoZGZfYWxsLCBncm91cCA9ICJzYW1wbGUiLCBjaT0wLjk1LCBuYm9vdD1uYm9vdCkKYWJ1bmRAYWJ1bmRhbmNlJHRyZWF0bWVudCA8LSBzYXBwbHkoYWJ1bmRAYWJ1bmRhbmNlJHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmFidW5kQGFidW5kYW5jZSR0aW1lX3BvaW50IDwtIHNhcHBseShhYnVuZEBhYnVuZGFuY2Ukc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKYWJ1bmRAYWJ1bmRhbmNlJHBhdGllbnQgPC0gc2FwcGx5KGFidW5kQGFidW5kYW5jZSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQphYnVuZF9tYWluIDwtIHBhc3RlMCgiQ2xvbmFsIGFidW5kYW5jZSAoTj0iLCBhYnVuZEBuWzFdLCAiKSIpCmBgYApgYGB7ciBjbG9uYWxfYWJ1bmRhbmNlMiwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTIsIGVjaG89RkFMU0V9CnBfY2EgPC0gZ2dwbG90KGFidW5kQGFidW5kYW5jZSwgYWVzKHggPSByYW5rLCB5ID0gcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzYW1wbGUpKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB1cHBlciwgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICBnZ3RpdGxlKGFidW5kX21haW4pICsKICAgIHhsYWIoIlJhbmsiKSArIHlsYWIoIkFidW5kYW5jZSIpICsKICAgIHNjYWxlX3hfbG9nMTAobGltaXRzID0gTlVMTCwKICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNjYWxlczo6dHJhbnNfYnJlYWtzKCJsb2cxMCIsIGZ1bmN0aW9uKHgpIDEwXngpLAogICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjp0cmFuc19mb3JtYXQoImxvZzEwIiwgc2NhbGVzOjptYXRoX2Zvcm1hdCgxMF4ueCkpKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHBhdGllbnQpLCByb3dzID0gdmFycyh0cmVhdG1lbnQpLCBzY2FsZXM9ImZyZWUiLCBkcm9wID0gVCkKcF9jYQpgYGAKCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0KZ2dzYXZlKHBsb3Q9cF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2Vfc3ViamVjdC5wZGYiKSwgZGV2aWNlPSJwZGYiLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1wX2NhLCBmaWxlbmFtZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCIvQ2xvbmFsX2FidW5kYW5jZV9zdWJqZWN0LnBuZyIpLCBkZXZpY2U9InBuZyIsIHdpZHRoID0gMjUsIGhlaWdodCA9IDYsIHVuaXRzPSJjbSIpCndyaXRlLnRhYmxlKGFidW5kQGFidW5kYW5jZSwgZmlsZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCAiL0Nsb25hbF9hYnVuZGFuY2VfZGF0YV9zdWJqZWN0LnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMjIENvdW50IGNsb25lcyBwZXIgc3ViamVjdAoKYGBge3IgY291bnRfY2xvbmVzfQpkZl9jb3VudGNsb25lc19jb3B5IDwtIGNvdW50Q2xvbmVzKGRmX2FsbCxncm91cHM9InNhbXBsZSIsY29weSA9ICJkdXBsaWNhdGVfY291bnQiKQpkZl9jb3VudGNsb25lc19jb3B5JHRyZWF0bWVudCA8LSBzYXBwbHkoZGZfY291bnRjbG9uZXNfY29weSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpkZl9jb3VudGNsb25lc19jb3B5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZGZfY291bnRjbG9uZXNfY29weSRwYXRpZW50IDwtIHNhcHBseShkZl9jb3VudGNsb25lc19jb3B5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCndyaXRlLnRhYmxlKGRmX2NvdW50Y2xvbmVzX2NvcHksIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfbnVtYmVyc19kYXRhX3N1YmplY3QudHN2IiksIHNlcCA9ICJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgojIyBDbG9uYWwgYWJ1bmRhbmNlIHBlciBjZWxsIHBvcHVsYXRpb24KCklmIGRpZmZlcmVudCB0eXBlcyBvZiBCLWNlbGwgb3IgVC1jZWxsIHBvcHVsYXRpb25zIGFyZSBwcm92aWRlZCwgaGVyZQp0aGUgY2xvbmFsIGFidW5kYW5jZSBpcyBwbG90dGVkIGZvciBlYWNoIHBhdGllbnQgYW5kIEIgLyBULWNlbGwgcG9wdWxhdGlvbi4KCmBgYHtyIGNsb25hbF9hYnVuZGFuY2VfcG9wLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKYWJ1bmRfcG9wIDwtIGVzdGltYXRlQWJ1bmRhbmNlKGRmX2FsbCwgY2xvbmU9ImNsb25lX2lkIiwgZ3JvdXAgPSAic2FtcGxlX3BvcCIsIGNpPTAuOTUsIG5ib290PW5ib290KQphYnVuZF9wb3BAYWJ1bmRhbmNlJHRyZWF0bWVudCA8LSBzYXBwbHkoYWJ1bmRfcG9wQGFidW5kYW5jZSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKYWJ1bmRfcG9wQGFidW5kYW5jZSR0aW1lX3BvaW50IDwtIHNhcHBseShhYnVuZF9wb3BAYWJ1bmRhbmNlJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQphYnVuZF9wb3BAYWJ1bmRhbmNlJHBhdGllbnQgPC0gc2FwcGx5KGFidW5kX3BvcEBhYnVuZGFuY2Ukc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmFidW5kX3BvcEBhYnVuZGFuY2UkcG9wdWxhdGlvbiA8LSBzYXBwbHkoYWJ1bmRfcG9wQGFidW5kYW5jZSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVs0XSkKYWJ1bmRfbWFpbiA8LSBwYXN0ZTAoIkNsb25hbCBhYnVuZGFuY2UgKE49IiwgYWJ1bmRfcG9wQG5bMV0sICIpIikKYGBgCgpgYGB7ciBjbG9uYWxfYWJ1bmRhbmNlX3BvcDIsIGZpZy53aWR0aD0xMiwgZWNobz1GQUxTRX0KYWJ1bmRfcG9wQGFidW5kYW5jZSRwb3B1bGF0aW9uIDwtIGZhY3RvcihhYnVuZF9wb3BAYWJ1bmRhbmNlJHBvcHVsYXRpb24sIGxldmVscyA9IGMoIk4iLCAiTSIsICJETiIsICJQIikpCmFidW5kX3BvcEBhYnVuZGFuY2UkdGltZV9wb2ludCA8LSBmYWN0b3IoYWJ1bmRfcG9wQGFidW5kYW5jZSR0aW1lX3BvaW50LCBsZXZlbHMgPSBjKCJiYXNlbGluZSIsICI2bW9udGhzIiwgIjEybW9udGhzIikpCnBvcF9jYSA8LSBnZ3Bsb3QoYWJ1bmRfcG9wQGFidW5kYW5jZSwgYWVzKHggPSByYW5rLCB5ID0gcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNhbXBsZV9wb3ApKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB1cHBlciwgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICBnZ3RpdGxlKGFidW5kX21haW4pICsKICAgIHhsYWIoIlJhbmsiKSArIHlsYWIoIkFidW5kYW5jZSIpICsgCiAgICBsYWJzKGNvbG9yPSJUaW1lIFBvaW50IiwgZmlsbD0iVGltZSBQb2ludCIpICsKICAgIHNjYWxlX3hfbG9nMTAobGltaXRzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54KSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIHNjYWxlcz0iZnJlZSIsIGRyb3AgPSBUKQpwb3BfY2EKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBuZyIpLCBkZXZpY2U9InBuZyIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCndyaXRlLnRhYmxlKGFidW5kX3BvcEBhYnVuZGFuY2UsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfYWJ1bmRhbmNlX2RhdGFfY2VsbF9wb3B1bGF0aW9uLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQoKYGBgCgojIyBDb3VudCBjbG9uZXMgcGVyIHBvcHVsYXRpb24KCmBgYHtyIGNvdW50X2Nsb25lc19wb3BfMiwgZWNobz1GfQpjb3VudF9jbG9uZXNfcG9wIDwtIGNvdW50Q2xvbmVzKGRmX2FsbCwgZ3JvdXBzID0gInNhbXBsZV9wb3AiLCBjb3B5ID0gImR1cGxpY2F0ZV9jb3VudCIpCgpjb3VudF9jbG9uZXNfcG9wJHRyZWF0bWVudCA8LSBzYXBwbHkoY291bnRfY2xvbmVzX3BvcCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKY291bnRfY2xvbmVzX3BvcCR0aW1lX3BvaW50IDwtIHNhcHBseShjb3VudF9jbG9uZXNfcG9wJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpjb3VudF9jbG9uZXNfcG9wJHBhdGllbnQgPC0gc2FwcGx5KGNvdW50X2Nsb25lc19wb3Akc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCndyaXRlLnRhYmxlKGNvdW50X2Nsb25lc19wb3AsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfbnVtYmVyc19kYXRhX3N1YmplY3RfcG9wdWxhdGlvbi50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQoKYGBgCgojIyBDbG9uYWwgZGl2ZXJzaWZpY2F0aW9uIGluZGV4CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKIyBDYWxjdWxhdGUgZ2luaSBpbmRleApjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX2luZGV4IDwtIGZ1bmN0aW9uKGRmKXsKICAjIENvbXB1dGluZyBjdW11bGF0aXZlIGZyZXF1ZW5jZSBkaXN0cmlidXRpb24KICBjbG9uZV9zZXF1ZW5jZXMgPC0gZGYkc2VxX2NvdW50CiAgUl92ZWMgPC0gYygpCiAgbiA9IDAKICBmb3IgKGogaW4gY2xvbmVfc2VxdWVuY2VzKXsKICAgIG4gPSBuICsgagogICAgUl92ZWMgPC0gYXBwZW5kKFJfdmVjLG4pCiAgfQogIFJfdmVjX25vcm0gPC0gUl92ZWMgLyBuCiAgCiAgbSA9IDAKICBnID0gMAogIGZvciAoaSBpbiBjKDE6bGVuZ3RoKFJfdmVjX25vcm0pKSl7CiAgICBnID0gZyArIChSX3ZlY19ub3JtW2ldIC0gaS9sZW5ndGgoUl92ZWNfbm9ybSkpCiAgfQogIGdpbmlfaW5kZXggPSBnL2xlbmd0aChSX3ZlY19ub3JtKQogIHJldHVybihnaW5pX2luZGV4KQp9CgpjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX21lYW4gPC0gYygpCmNsb25hbF9kaXZlcnNpZmljYXRpb25fc3RkIDwtIGMoKQpzYW1wbGVfbmFtZSA8LSBjKCkKY2xvbmVzX3NhbXBsZV9wb3AgPC0gc3BsaXQoY291bnRfY2xvbmVzX3BvcCwgY291bnRfY2xvbmVzX3BvcCRzYW1wbGVfcG9wKQojIFJlbW92aW5nIENMQUQ0ICBOCmNsb25lc19zYW1wbGVfcG9wJENsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIDwtIE5VTEwKY2xvbmVzX3NhbXBsZV9wb3AkQ2xhZHJpYmluXzEybW9udGhzX0NMQUQ0X04gPC0gTlVMTApjbG9uZXNfc2FtcGxlX3BvcCRDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIDwtIE5VTEwKY2xvbmVOIDwtIGNvdW50KGNvdW50X2Nsb25lc19wb3AsIHZhcnM9InNhbXBsZV9wb3AiKQpzYW1wbGVfc2l6ZSA8LSBtaW4oY2xvbmVOJG4pCgojIENhbGN1bGF0ZSBnaW5pIGluZGV4IGZvciBib290c3RyYXAgc2FtcGxlcwpmb3IgKGkgaW4gYygxOmxlbmd0aChjbG9uZXNfc2FtcGxlX3BvcCkpKSB7CiAgZ2lfYm9vdCA8LSBjKCkKICBmb3IgKHIgaW4gYygxOm5ib290KSkgewogICAgIyBzYW1wbGUgTiBjbG9uZXMgYWNjb3JkaW5nIHRvIHNhbXBsZSBzaXplCiAgICBzYW1wbGVfZGYgPC0gc2FtcGxlX24oY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSwgc2l6ZSA9IHNhbXBsZV9zaXplLCByZXBsYWNlID0gRiwgd2VpZ2h0ID0gY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSRzZXFfZnJlcSkKICAgIGdpIDwtIGNsb25hbF9kaXZlcnNpZmljYXRpb25faW5kZXgoc2FtcGxlX2RmKQogICAgZ2lfYm9vdCA8LSBhcHBlbmQoZ2lfYm9vdCwgZ2kpCiAgfQogIGNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiA8LSBhcHBlbmQoY2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9tZWFuLCBtZWFuKGdpX2Jvb3QpKQogIGNsb25hbF9kaXZlcnNpZmljYXRpb25fc3RkIDwtIGFwcGVuZChjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX3N0ZCwgc2QoZ2lfYm9vdCkpCiAgc2FtcGxlX25hbWUgPC0gYXBwZW5kKHNhbXBsZV9uYW1lLCBuYW1lcyhjbG9uZXNfc2FtcGxlX3BvcClbaV0pCn0KCmRmX2dpbmlfaW5kZXggPC0gZGF0YS5mcmFtZShzYW1wbGVfcG9wID0gc2FtcGxlX25hbWUsIGNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiA9IGNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiwgY2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9zdGQgPSBjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX3N0ZCkKZGZfZ2luaV9pbmRleCR0cmVhdG1lbnQgPC0gc2FwcGx5KGRmX2dpbmlfaW5kZXgkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmRmX2dpbmlfaW5kZXgkdGltZV9wb2ludCA8LSBzYXBwbHkoZGZfZ2luaV9pbmRleCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZGZfZ2luaV9pbmRleCRwYXRpZW50IDwtIHNhcHBseShkZl9naW5pX2luZGV4JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpkZl9naW5pX2luZGV4JHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2dpbmlfaW5kZXgkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbNF0pCmRmX2dpbmlfaW5kZXgkdGltZV9wb2ludCA8LSBmYWN0b3IoZGZfZ2luaV9pbmRleCR0aW1lX3BvaW50LCBjKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpkZl9naW5pX2luZGV4JHBvcHVsYXRpb24gPC0gZmFjdG9yKGRmX2dpbmlfaW5kZXgkcG9wdWxhdGlvbiwgYygiTiIsICJNIiwgIkROIiwgIlAiKSkKCndyaXRlLnRhYmxlKGRmX2dpbmlfaW5kZXgsIHBhc3RlMChhYnVuZGFuY2VfZGlyLCAiL0Nsb25hbF9kaXZlcnNpZmljYXRpb25faW5kZXhfdGFibGUudHN2IiksCiAgICAgICAgICAgIHNlcD0iXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCgpgYGAKCmBgYHtyIGNsb25hbF9kaXZlcnNpZmljYXRpb25fYm94cGxvdCwgZmlnLndpZHRoPTYsIGZpZy5hc3A9MC41LCBlY2hvPUZBTFNFfQojIGJveHBsb3RfZ2luaSA8LSBnZ3Bsb3QoZGZfZ2luaV9pbmRleCwgYWVzKHk9Y2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9tZWFuLCB4PXRpbWVfcG9pbnQpKSArCiMgICAgIGdlb21fYm94cGxvdCgpICsKIyAgICAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIHNpemUgPSAxKSArCiMgICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4yLCBwb3NpdGlvbj1kb2RnZSkgKwojICAgICB4bGFiKCIiKSArIHlsYWIoIkNsb25hbCBkaXZlcnNpZmljYXRpb24iKSArCiMgICAgIGdndGl0bGUocGFzdGUwKCJDbG9uYWwgZGl2ZXJzaWZpY2F0aW9uIGluZGV4IChOID0gIixzYW1wbGVfc2l6ZSwiKSIpKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwojICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQojIGJveHBsb3RfZ2luaQoKIyBCb3hwbG90IHdpdGggV2lsY294b24gcGFpcmVkIHRlc3RzIChnZ3B1YnIpCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmJveHBsb3RfZ2luaSA8LSBnZ2JveHBsb3QoZGZfZ2luaV9pbmRleCwgeCA9ICJ0aW1lX3BvaW50IiwgeSA9ICJjbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX21lYW4iLAogICAgICAgIGFkZCA9ICJqaXR0ZXIiLCBsZWdlbmQgPSAibm9uZSIsCiAgICAgICAgIGNvbG9yID0gInRpbWVfcG9pbnQiLCBsaW5lLmNvbG9yID0gImdyYXkiLCBsaW5lLnNpemUgPSAwLjQsCiAgICAgICAgIGZhY2V0LmJ5ID0gInBvcHVsYXRpb24iLCBuY29sID0gNCwgc2hvcnQucGFuZWwubGFicyA9IFQpICsKICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpICsKICAgICAgICAjdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3Q9MSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICAgICAgIHhsYWIoIiIpICsgeWxhYigiQ2xvbmFsIGRpdmVyc2lmaWNhdGlvbiIpICsKICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkID1ULCBtZXRob2QgPSAid2lsY294IiwgbGFiZWw9InAuc2lnbmlmIikgKwogICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhsYWJlbD0icC5mb3JtYXQiLCBsYWJlbC55PTAuNikKYm94cGxvdF9naW5pCgpib3hwbG90X2dpbmlfbm9rcnVza2FsIDwtIGdnYm94cGxvdChkZl9naW5pX2luZGV4LCB4ID0gInRpbWVfcG9pbnQiLCB5ID0gImNsb25hbF9kaXZlcnNpZmljYXRpb25fbWVhbiIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJDbG9uYWwgZGl2ZXJzaWZpY2F0aW9uIikgKwogICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBwYWlyZWQgPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiKQpib3hwbG90X2dpbmlfbm9rcnVza2FsCmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKHBsb3Q9Ym94cGxvdF9naW5pLCBmaWxlbmFtZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCIvQ2xvbmFsX2RpdmVyc2lmaWNhdGlvbl9pbmRleF9wYXRpZW50X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwgCiAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1ib3hwbG90X2dpbmksIGZpbGVuYW1lID0gcGFzdGUwKGFidW5kYW5jZV9kaXIsIi9DbG9uYWxfZGl2ZXJzaWZpY2F0aW9uX2luZGV4X3BhdGllbnRfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLCAKICAgICAgIHdpZHRoPTIwLCBoZWlnaHQ9NywgdW5pdHM9ImNtIikKCmBgYAoKCgoKYGBge3IgY2xvbmFsX3NpemVzLCBlY2hvID0gRn0KCiMgQ2FsY3VsYXRlIGNsb25hbCBzaXplIHBlcmNlbnRhZ2VzCmNsb25lX3BlcmNlbnRhZ2VfZ3Rfc2l6ZSA8LSBmdW5jdGlvbihkZiwgc2l6ZSl7CiAgIyBDb21wdXRpbmcgY3VtdWxhdGl2ZSBmcmVxdWVuY2UgZGlzdHJpYnV0aW9uCiAgY2xvbmVfc2VxdWVuY2VzIDwtIGRmJHNlcV9jb3VudAogIGRmX3NpemUgPC0gZGZbd2hpY2goY2xvbmVfc2VxdWVuY2VzID49IHNpemUpLF0KICBjbG9uZV9OIDwtIG5yb3coZGYpCiAgY2xvbmVfc2l6ZV9OIDwtIG5yb3coZGZfc2l6ZSkKICBwZXJjZW50YWdlX3NpemUgPC0gY2xvbmVfc2l6ZV9OICogMTAwIC8gY2xvbmVfTgogIHJldHVybihwZXJjZW50YWdlX3NpemUpCn0KCnBlcmNlbnRhZ2VfZ3RfMiA8LSBjKCkKcGVyY2VudGFnZV9ndF81IDwtIGMoKQpwZXJjZW50YWdlX2d0XzEwIDwtIGMoKQpwZXJjZW50YWdlX2d0XzUwIDwtIGMoKQpwZXJjZW50YWdlX2d0XzEwMCA8LSBjKCkKcGVyY2VudGFnZV9ndF81MDAgPC0gYygpCnBlcmNlbnRhZ2VfZ3RfMTAwMCA8LSBjKCkKcGVyY2VudGFnZV9ndF8yIDwtIGMoKQpzZF9wZXJjZW50YWdlX2d0XzIgPC0gYygpCnNkX3BlcmNlbnRhZ2VfZ3RfNSA8LSBjKCkKc2RfcGVyY2VudGFnZV9ndF8xMCA8LSBjKCkKc2RfcGVyY2VudGFnZV9ndF81MCA8LSBjKCkKc2RfcGVyY2VudGFnZV9ndF8xMDAgPC0gYygpCnNkX3BlcmNlbnRhZ2VfZ3RfNTAwIDwtIGMoKQpzZF9wZXJjZW50YWdlX2d0XzEwMDAgPC0gYygpCgpzYW1wbGVfbmFtZSA8LSBjKCkKY2xvbmVzX3NhbXBsZV9wb3AgPC0gc3BsaXQoY291bnRfY2xvbmVzX3BvcCwgY291bnRfY2xvbmVzX3BvcCRzYW1wbGVfcG9wKQpjbG9uZXNfc2FtcGxlX3BvcCRDbGFkcmliaW5fYmFzZWxpbmVfQ0xBRDRfTiA8LSBOVUxMCmNsb25lc19zYW1wbGVfcG9wJENsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIDwtIE5VTEwKY2xvbmVzX3NhbXBsZV9wb3AkQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiA8LSBOVUxMCmNsb25lTiA8LSBjb3VudChjb3VudF9jbG9uZXNfcG9wLCB2YXJzPSJzYW1wbGVfcG9wIikKc2FtcGxlX3NpemUgPC0gbWluKGNsb25lTiRuKQoKZm9yIChpIGluIGMoMTpsZW5ndGgoY2xvbmVzX3NhbXBsZV9wb3ApKSkgewogIHBlcmNlbnRhZ2VfZ3RfMl9ib290IDwtIGMoKQogIHBlcmNlbnRhZ2VfZ3RfNV9ib290IDwtIGMoKQogIHBlcmNlbnRhZ2VfZ3RfMTBfYm9vdCA8LSBjKCkKICBwZXJjZW50YWdlX2d0XzUwX2Jvb3QgPC0gYygpCiAgcGVyY2VudGFnZV9ndF8xMDBfYm9vdCA8LSBjKCkKICBwZXJjZW50YWdlX2d0XzUwMF9ib290IDwtIGMoKQogIHBlcmNlbnRhZ2VfZ3RfMTAwMF9ib290IDwtIGMoKQogIGZvciAociBpbiBjKDE6bmJvb3QpKSB7CiAgICBzYW1wbGVfZGYgPC0gc2FtcGxlX24oY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSwgc2l6ZSA9IHNhbXBsZV9zaXplLCByZXBsYWNlID0gRiwgd2VpZ2h0ID0gY2xvbmVzX3NhbXBsZV9wb3BbW2ldXSRzZXFfZnJlcSkKICAgIHBlcmNlbnRhZ2VfZ3RfMl9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzJfYm9vdCwgY2xvbmVfcGVyY2VudGFnZV9ndF9zaXplKHNhbXBsZV9kZiwgMikpCiAgICBwZXJjZW50YWdlX2d0XzVfYm9vdCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81X2Jvb3QsIGNsb25lX3BlcmNlbnRhZ2VfZ3Rfc2l6ZShzYW1wbGVfZGYsIDUpKQogICAgcGVyY2VudGFnZV9ndF8xMF9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwX2Jvb3QsIGNsb25lX3BlcmNlbnRhZ2VfZ3Rfc2l6ZShzYW1wbGVfZGYsIDEwKSkKICAgIHBlcmNlbnRhZ2VfZ3RfNTBfYm9vdCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MF9ib290LCBjbG9uZV9wZXJjZW50YWdlX2d0X3NpemUoc2FtcGxlX2RmLCA1MCkpCiAgICBwZXJjZW50YWdlX2d0XzEwMF9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMF9ib290LCBjbG9uZV9wZXJjZW50YWdlX2d0X3NpemUoc2FtcGxlX2RmLCAxMDApKQogICAgcGVyY2VudGFnZV9ndF81MDBfYm9vdCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MDBfYm9vdCwgY2xvbmVfcGVyY2VudGFnZV9ndF9zaXplKHNhbXBsZV9kZiwgNTAwKSkKICAgIHBlcmNlbnRhZ2VfZ3RfMTAwMF9ib290IDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMDBfYm9vdCxjbG9uZV9wZXJjZW50YWdlX2d0X3NpemUoc2FtcGxlX2RmLCAxMDAwKSkKICB9CiAgcGVyY2VudGFnZV9ndF8yIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzIsIG1lYW4ocGVyY2VudGFnZV9ndF8yX2Jvb3QpKQogIHBlcmNlbnRhZ2VfZ3RfNSA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81LCBtZWFuKHBlcmNlbnRhZ2VfZ3RfNV9ib290KSkKICBwZXJjZW50YWdlX2d0XzEwIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwLCBtZWFuKHBlcmNlbnRhZ2VfZ3RfMTBfYm9vdCkpCiAgcGVyY2VudGFnZV9ndF81MCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MCwgbWVhbihwZXJjZW50YWdlX2d0XzUwX2Jvb3QpKQogIHBlcmNlbnRhZ2VfZ3RfMTAwIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMCwgbWVhbihwZXJjZW50YWdlX2d0XzEwMF9ib290KSkKICBwZXJjZW50YWdlX2d0XzUwMCA8LSBhcHBlbmQocGVyY2VudGFnZV9ndF81MDAsIG1lYW4ocGVyY2VudGFnZV9ndF81MDBfYm9vdCkpCiAgcGVyY2VudGFnZV9ndF8xMDAwIDwtIGFwcGVuZChwZXJjZW50YWdlX2d0XzEwMDAsIG1lYW4ocGVyY2VudGFnZV9ndF8xMDAwX2Jvb3QpKQogIHNkX3BlcmNlbnRhZ2VfZ3RfMiA8LSBhcHBlbmQoc2RfcGVyY2VudGFnZV9ndF8yLCBzZChwZXJjZW50YWdlX2d0XzJfYm9vdCkpCiAgc2RfcGVyY2VudGFnZV9ndF81IDwtIGFwcGVuZChzZF9wZXJjZW50YWdlX2d0XzUsIHNkKHBlcmNlbnRhZ2VfZ3RfNV9ib290KSkKICBzZF9wZXJjZW50YWdlX2d0XzEwIDwtIGFwcGVuZChzZF9wZXJjZW50YWdlX2d0XzEwLCBzZChwZXJjZW50YWdlX2d0XzEwX2Jvb3QpKQogIHNkX3BlcmNlbnRhZ2VfZ3RfNTAgPC0gYXBwZW5kKHNkX3BlcmNlbnRhZ2VfZ3RfNTAsIHNkKHBlcmNlbnRhZ2VfZ3RfNTBfYm9vdCkpCiAgc2RfcGVyY2VudGFnZV9ndF8xMDAgPC0gYXBwZW5kKHNkX3BlcmNlbnRhZ2VfZ3RfMTAwLCBzZChwZXJjZW50YWdlX2d0XzEwMF9ib290KSkKICBzZF9wZXJjZW50YWdlX2d0XzUwMCA8LSBhcHBlbmQoc2RfcGVyY2VudGFnZV9ndF81MDAsIHNkKHBlcmNlbnRhZ2VfZ3RfNTAwX2Jvb3QpKQogIHNkX3BlcmNlbnRhZ2VfZ3RfMTAwMCA8LSBhcHBlbmQoc2RfcGVyY2VudGFnZV9ndF8xMDAwLCBzZChwZXJjZW50YWdlX2d0XzEwMDBfYm9vdCkpCiAgc2FtcGxlX25hbWUgPC0gYXBwZW5kKHNhbXBsZV9uYW1lLCBuYW1lcyhjbG9uZXNfc2FtcGxlX3BvcClbaV0pCn0KCmNsb25lc19wZXJjZW50YWdlcyA8LSBkYXRhLmZyYW1lKHNhbXBsZV9wb3AgPSBzYW1wbGVfbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzIgPSBwZXJjZW50YWdlX2d0XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzUgPSBwZXJjZW50YWdlX2d0XzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzEwID0gcGVyY2VudGFnZV9ndF8xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfNTAgPSBwZXJjZW50YWdlX2d0XzUwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfMTAwID0gcGVyY2VudGFnZV9ndF8xMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzUwMCA9IHBlcmNlbnRhZ2VfZ3RfNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndF8xMDAwID0gcGVyY2VudGFnZV9ndF8xMDAwKQpjbG9uZXNfcGVyY2VudGFnZXMgPC0gY2xvbmVzX3BlcmNlbnRhZ2VzICU+JSBkaXN0aW5jdChzYW1wbGVfcG9wLC5rZWVwX2FsbD1UKQpjbG9uZXNfc2RfcGVyY2VudGFnZXMgPC0gZGF0YS5mcmFtZShzYW1wbGVfcG9wID0gc2FtcGxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzIgPSBzZF9wZXJjZW50YWdlX2d0XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzUgPSBzZF9wZXJjZW50YWdlX2d0XzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzEwID0gc2RfcGVyY2VudGFnZV9ndF8xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfNTAgPSBzZF9wZXJjZW50YWdlX2d0XzUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndF8xMDAgPSBzZF9wZXJjZW50YWdlX2d0XzEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RfNTAwID0gc2RfcGVyY2VudGFnZV9ndF81MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0XzEwMDAgPSBzZF9wZXJjZW50YWdlX2d0XzEwMDApCmNsb25lc19zZF9wZXJjZW50YWdlcyA8LSBjbG9uZXNfc2RfcGVyY2VudGFnZXMgJT4lIGRpc3RpbmN0KHNhbXBsZV9wb3AsIC5rZWVwX2FsbD1UKQpjbG9uZXNfcGVyY2VudGFnZXNfbWVsdCA8LSBtZWx0KGRhdGEudGFibGUoY2xvbmVzX3BlcmNlbnRhZ2VzKSwgaWQgPSAic2FtcGxlX3BvcCIsIHZhbHVlLm5hbWUgPSAicGVyY2VudGFnZSIpCmNsb25lc19zZF9wZXJjZW50YWdlc19tZWx0IDwtIG1lbHQoZGF0YS50YWJsZShjbG9uZXNfc2RfcGVyY2VudGFnZXMpLCBpZD0ic2FtcGxlX3BvcCIsIHZhbHVlLm5hbWUgPSAic2QiKQoKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmIDwtIG1lcmdlKHg9Y2xvbmVzX3BlcmNlbnRhZ2VzX21lbHQsIHk9Y2xvbmVzX3NkX3BlcmNlbnRhZ2VzX21lbHQsIGJ5PWMoInNhbXBsZV9wb3AiLCJ2YXJpYWJsZSIpKQoKCmNsb25lc19wZXJjZW50YWdlc19kZiR0cmVhdG1lbnQgPC0gc2FwcGx5KGNsb25lc19wZXJjZW50YWdlc19kZiRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHRpbWVfcG9pbnQgPC0gc2FwcGx5KGNsb25lc19wZXJjZW50YWdlc19kZiRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHRpbWVfcG9pbnQgPC0gZmFjdG9yKGNsb25lc19wZXJjZW50YWdlc19kZiR0aW1lX3BvaW50LGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpjbG9uZXNfcGVyY2VudGFnZXNfZGYkcGF0aWVudCA8LSBzYXBwbHkoY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpjbG9uZXNfcGVyY2VudGFnZXNfZGYkcG9wdWxhdGlvbiA8LSBzYXBwbHkoY2xvbmVzX3BlcmNlbnRhZ2VzX2RmJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQoKY2xvbmVzX3BlcmNlbnRhZ2VzX2RmIDwtIGNsb25lc19wZXJjZW50YWdlc19kZiAlPiUgZGlzdGluY3QoKQoKd3JpdGUudGFibGUoY2xvbmVzX3BlcmNlbnRhZ2VzX2RmLCBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9zaXplX3BlcmNlbnRhZ2VfcGF0aWVudF9wb3B1bGF0aW9uX3RhYmxlLnRzdiIgKSwKICAgICAgICAgICAgc2VwPSJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgpgYGB7ciBjbG9uYWxfcGVyY2VudGFnZV9ib3hwbG90LCBmaWcud2lkdGg9NiwgZmlnLmFzcD0wLjUsZWNobz1GQUxTRX0KY2xvbmVzX3BlcmNlbnRhZ2Vfb25lX0MgPC0gY2xvbmVzX3BlcmNlbnRhZ2VzX2RmW3doaWNoKGNsb25lc19wZXJjZW50YWdlc19kZiR2YXJpYWJsZSAlaW4lIGMoImd0XzEwMCIpKSxdCmNsb25lc19wZXJjZW50YWdlX29uZV9DJHRpbWVfcG9pbnQgPC0gZmFjdG9yKGNsb25lc19wZXJjZW50YWdlX29uZV9DJHRpbWVfcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpjbG9uZXNfcGVyY2VudGFnZV9vbmVfQyRwb3B1bGF0aW9uIDwtIGZhY3RvcihjbG9uZXNfcGVyY2VudGFnZV9vbmVfQyRwb3B1bGF0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoIk4iLCAiTSIsICJETiIsICJQIikpCiMgYm94cGxvdF9jbG9uZV9zaXplIDwtIGdncGxvdChjbG9uZXNfcGVyY2VudGFnZV9vbmVfQywgYWVzKHk9cGVyY2VudGFnZSwgeD10aW1lX3BvaW50KSkgKwojICAgICBnZW9tX2JveHBsb3QoKSArCiMgICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDEpICsKIyAgICAgI2dlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiMgICAgIHhsYWIoIiIpICsgeWxhYigiUGVyY2VudGFnZSIpICsKIyAgICAgZ2d0aXRsZShwYXN0ZTAoIkNsb25hbCBzaXplIHBlcmNlbnRhZ2UgKE4gPSAiLHNhbXBsZV9zaXplLCIpIGdyZWF0ZXIgdGhhbiAxMCIpKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwojICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQojIGJveHBsb3RfY2xvbmVfc2l6ZQoKbXlfY29tcGFyaXNvbnMgPC0gbGlzdCggYygiYmFzZWxpbmUiLCAiNm1vbnRocyIpLCBjKCI2bW9udGhzIiwgIjEybW9udGhzIiksIGMoImJhc2VsaW5lIiwgIjEybW9udGhzIikgKQoKYm94cGxvdF9jbG9uZV9zaXplIDwtIGdnYm94cGxvdChjbG9uZXNfcGVyY2VudGFnZV9vbmVfQywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJ0aW1lX3BvaW50IiwgeSA9ICJwZXJjZW50YWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgbGVnZW5kID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRpbWVfcG9pbnQiLCBsaW5lLmNvbG9yID0gImdyYXkiLCBsaW5lLnNpemUgPSAwLjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3M9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCIiwgIjZNIiwgIjEyTSIpKSArCiAgICAgICAgI3RoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgICAgICB4bGFiKCIiKSArIHlsYWIoIiUgQ2xvbmVzID4gMTAwIikgKwogICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBwYWlyZWQgPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnkgPSAxOSkKCmJveHBsb3RfY2xvbmVfc2l6ZQoKYm94cGxvdF9jbG9uZV9zaXplX25va3J1c2thbCA8LSBnZ2JveHBsb3QoY2xvbmVzX3BlcmNlbnRhZ2Vfb25lX0MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAidGltZV9wb2ludCIsIHkgPSAicGVyY2VudGFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ0aW1lX3BvaW50IiwgbGluZS5jb2xvciA9ICJncmF5IiwgbGluZS5zaXplID0gMC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gInBvcHVsYXRpb24iLCBuY29sID0gNCwgc2hvcnQucGFuZWwubGFicyA9IFQpICsKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCIlIENsb25lcyA+IDEwMCIpICsKICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkID1ULCBtZXRob2QgPSAid2lsY294IiwgbGFiZWw9InAuc2lnbmlmIikKYm94cGxvdF9jbG9uZV9zaXplX25va3J1c2thbApgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShwbG90PWJveHBsb3RfY2xvbmVfc2l6ZSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25lc19wZXJjZW50YWdlc19ncmVhdGVyX3RoYW5fMTAwLnBuZyIpLCBkZXZpY2U9InBuZyIsIAogICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNywgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3Q9Ym94cGxvdF9jbG9uZV9zaXplLCBmaWxlbmFtZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCIvQ2xvbmVzX3BlcmNlbnRhZ2VzX2dyZWF0ZXJfdGhhbl8xMDAucGRmIiksIGRldmljZT0icGRmIiwgCiAgICAgICB3aWR0aD0yMCwgaGVpZ2h0PTcsIHVuaXRzPSJjbSIpCmBgYAoKIyMgQ291bnQgY2xvbmVzIHBlciBwb3B1bGF0aW9uCgpgYGB7ciBjb3VudF9jbG9uZXNfcG9wfQpkZl9jb3VudGNsb25lc19jb3B5IDwtIGNvdW50Q2xvbmVzKGRmX2FsbCxncm91cHM9InNhbXBsZV9wb3AiLGNvcHkgPSAiZHVwbGljYXRlX2NvdW50IikKZGZfY291bnRjbG9uZXNfY29weSR0cmVhdG1lbnQgPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmRmX2NvdW50Y2xvbmVzX2NvcHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZGZfY291bnRjbG9uZXNfY29weSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZGZfY291bnRjbG9uZXNfY29weSRwYXRpZW50IDwtIHNhcHBseShkZl9jb3VudGNsb25lc19jb3B5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpkZl9jb3VudGNsb25lc19jb3B5JHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkKdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbNF0pCndyaXRlLnRhYmxlKGRmX2NvdW50Y2xvbmVzX2NvcHksIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfbnVtYmVyc19kYXRhX3N1YmplY3RfcG9wdWxhdGlvbi50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMgQ2xvbmFsIGRpdmVyc2l0eQoKVGhlIGNsb25hbCBkaXZlcnNpdHkgJEQkIG9mIHRoZSByZXBlcnRvaXJlIHdhcyBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgZ2VuZXJhbCBmb3JtdWxhIG9mIEhpbGwgRGl2ZXJzaXR5Cm51bWJlcnM6CgokJApcYmVnaW57YWxpZ25lZH0KICAgIF57cX1EID0gXGxlZnQoIFxzdW1fe2k9MX1eUnBfaV5xIFxyaWdodCleezEvKDEtcSl9ClxlbmR7YWxpZ25lZH0KJCQKCndoZXJlOgoKKiAkcF9pJCBpcyB0aGUgcHJvcG9ydGlvbiBvZiB1bmlxdWUgc2VxdWVuY2VzIGJlbG9uZ2luZyB0byBjbG9uZSAkaSQuCiogJHEkIGFyZSB0aGUgdmFsdWVzIG9mIHRoZSBkaWZmZXJlbnQgZGl2ZXJzaXR5IG51bWJlcnMuCiogJFIkIGlzIHRoZSBSaWNobmVzcywgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY2xvbmVzIGluIHRoZSBzYW1wbGUuCgpBdCAkcT0xJCB0aGUgZnVuY3Rpb24gaXMgdW5kZWZpbmVkIGFuZCB0aGUgbGltaXQgdG8gemVybyBlcXVhbHMgdGhlIGV4cG9uZW50aWFsIG9mIHRoZSBTaGFubm9uIEVudHJvcHk6CgokJApcYmVnaW57YWxpZ25lZH0KICAgIF57MX1EID0gZXhwIFxsZWZ0KCAgXHN1bV97aT0xfV5ScF9pIGxuKHBfaSkgIFxyaWdodCkKXGVuZHthbGlnbmVkfQokJAoKVGhlIGludHVpdGlvbiBhYm91dCB0aGUgZGlmZmVyZW50IEhpbGwgRGl2ZXJzaXR5IHZhbHVlcyBpcyB0aGUgZm9sbG93aW5nOgoKKiBBdCAkcT0wJCB0aGUgZGl2ZXJzaXR5IGluZGV4IGVxdWFscyB0aGUgbnVtYmVyIG9mIGNsb25lcyBpbiB0aGUgc2FtcGxlLgoqIEF0ICRxPTEkIHRoZSBkaXZlcnNpdHkgaW5kZXggaXMgdGhlIGdlb21ldHJpYyBtZWFuIG9mIHRoZSBjbG9uZXMgaW4gdGhlIHNhbXBsZSwKd2VpZ2h0ZWQgYnkgdGhlaXIgcHJvcG9ydGlvbiBpbiB0aGUgc2FtcGxlLgoqIEF0ICRxPjEkIG1vcmUgd2VpZ2h0IGlzIGdpdmVuIHRvIHRoZSBjbG9uZXMgd2l0aCBoaWdoZXIgcHJvcG9ydGlvbnMgaW4gdGhlIHNhbXBsZS4KCkFsbCBjbG9uYWwgZGl2ZXJzaXR5IHBsb3RzIGFuZCB0YWJsZXMgd2l0aCBkaXZlcnNpdHkgdmFsdWVzIGNhbiBiZSBmb3VuZCB1bmRlciBgcmVwZXJ0b2lyZV9hbmFseXNpcy9EaXZlcnNpdHlgLgpUbyBjb3JyZWN0IGZvciB0aGUgZGlmZmVyZW50IG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcywgdGhlIEJvb3RzdHJhcHBpbmcgdGVjaG5pcXVlIHdhcyBlbXBsb3llZCwKaW4gd2hpY2ggYHIgbmJvb3RgIHJhbmRvbSBib290c3RyYXAgc2FtcGxlcyB3ZXJlIHRha2VuLCB3aXRoIHNpemUgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gdGhlIHNhbXBsZSB3aXRoIGxlc3Mgc2VxdWVuY2VzIChOKS4KVGhlIHNvbGlkIGxpbmUgc2hvd3MgdGhlIG1lYW4gRGl2ZXJzaXR5IG9mIHRoZSBib290c3RyYXAgc2FtcGxlcywgd2hlcmVhcyB0aGUgdHJhbnNwYXJlbnQgYXJlYSBzaG93cyB0aGUgZnVsbCBEaXZlcnNpdHkKcmFuZ2Ugb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGVzLgoKCiMjIENsb25hbCBkaXZlcnNpdHkgcGVyIHN1YmplY3QKYGBge3IgY2xvbmFsX2RpdmVyc2l0eSwgZWNobyA9IEZBTFNFLCBpbmNsdWRlPUZBTFNFfQpzYW1wbGVfZGl2IDwtIGFscGhhRGl2ZXJzaXR5KGFidW5kLCBncm91cD0ic2FtcGxlIiwgbWluX3E9MCwgbWF4X3E9NCwgc3RlcF9xPTAuMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaT0wLjk1LCBuYm9vdD1uYm9vdCkKc2FtcGxlX21haW4gPC0gcGFzdGUwKCJTYW1wbGUgZGl2ZXJzaXR5IChOPSIsIHNhbXBsZV9kaXZAblsxXSwgIikiKQpzYW1wbGVfZGl2QGRpdmVyc2l0eSR0cmVhdG1lbnQgPC0gc2FwcGx5KHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCnNhbXBsZV9kaXZAZGl2ZXJzaXR5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCnNhbXBsZV9kaXZAZGl2ZXJzaXR5JHBhdGllbnQgPC0gc2FwcGx5KHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmBgYApgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5MiwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9MTIsIGVjaG8gPSBGQUxTRX0KZGl2X3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZAZGl2ZXJzaXR5LCBhZXMoeCA9IHEsIHkgPSBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzYW1wbGUpKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGRfbG93ZXIsCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IGRfdXBwZXIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICB4bGFiKCJxIikgKyB5bGFiKGV4cHJlc3Npb24oIiJecSAqIEQpKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBmYWNldF9ncmlkKGNvbHM9dmFycyhwYXRpZW50KSkKZGl2X3AKYGBgCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0KZ2dzYXZlKHBsb3Q9ZGl2X3AsIGZpbGVuYW1lPXBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3BhdGllbnRfZ3JpZC5wbmciKSwgZGV2aWNlPSJwbmciLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1kaXZfcCwgZmlsZW5hbWU9cGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfcGF0aWVudF9ncmlkLnBkZiIpLCBkZXZpY2U9InBkZiIsIHdpZHRoID0gMjUsIGhlaWdodCA9IDYsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIENsb25hbCBkaXZlcnNpdHkgYXQgc3BlY2lmaWMgcSB2YWx1ZXMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMjIHE9MSB7LX0KCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcTEsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTUsIGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2RpdkBkaXZlcnNpdHkkdGltZV9wb2ludCA8LSBmYWN0b3Ioc2FtcGxlX2RpdkBkaXZlcnNpdHkkdGltZV9wb2ludCwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCnNhbXBsZV9kaXZfcTEgPC0gc2FtcGxlX2RpdkBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2RpdkBkaXZlcnNpdHkkcSA9PSAxKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTEgKE49Iiwgc2FtcGxlX2RpdkBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTEgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTEsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXBhdGllbnQsZ3JvdXA9dGltZV9wb2ludCkscG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4wNSwgcG9zaXRpb249ZG9kZ2UpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9cGF0aWVudCxjb2xvcj1wYXRpZW50KSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MSkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikrCiAgICAjZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIGRyb3A9VCwgc3BhY2U9ImZyZWUiLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIyBxPTAgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3EwLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LCBlY2hvID0gRkFMU0V9CnNhbXBsZV9kaXZfcTAgPC0gc2FtcGxlX2RpdkBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2RpdkBkaXZlcnNpdHkkcSA9PSAwKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTAgKE49Iiwgc2FtcGxlX2RpdkBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTAgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTAsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXBhdGllbnQsZ3JvdXA9dGltZV9wb2ludCkscG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4wNSwgcG9zaXRpb249ZG9kZ2UpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9cGF0aWVudCxjb2xvcj1wYXRpZW50KSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikrCiAgICAjZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIGRyb3A9VCwgc3BhY2U9ImZyZWUiLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHEwLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3N1YmplY3RfcGFpcmVkLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKYGBgCgojIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBjZWxsIHBvcHVsYXRpb24KCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcG9wLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnNhbXBsZV9kaXZfcG9wIDwtIGFscGhhRGl2ZXJzaXR5KGFidW5kX3BvcCwgZ3JvdXA9InNhbXBsZV9wb3AiLCBtaW5fcT0wLCBtYXhfcT00LCBzdGVwX3E9MC4wNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaT0wLjk1LCBuYm9vdD1uYm9vdCkKc2FtcGxlX21haW4gPC0gcGFzdGUwKCJTYW1wbGUgZGl2ZXJzaXR5IChOPSIsIHNhbXBsZV9kaXZfcG9wQG5bMV0sICIpIikKc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHRyZWF0bWVudCA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkdGltZV9wb2ludCA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcGF0aWVudCA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcG9wdWxhdGlvbiA8LSBzYXBwbHkoc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQpgYGAKCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcG9wX3Bsb3QsIGZpZy53aWR0aD0xMiwgZWNobz1GLCBtZXNzYWdlPUZ9CnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSR0aW1lX3BvaW50IDwtIGZhY3RvcihzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkdGltZV9wb2ludCwgbGV2ZWxzID0gYygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHBvcHVsYXRpb24gPC0gZmFjdG9yKHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSRwb3B1bGF0aW9uLCBsZXZlbHMgPSBjKCJOIiwgIk0iLCAiRE4iLCAiUCIpKQpzYW1wbGVfZGl2X3BvcF9kZiA8LSAgc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5CmRpdl9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSwgYWVzKHggPSBxLCB5ID0gZCwgZ3JvdXAgPSBzYW1wbGVfcG9wKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBkX2xvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBkX3VwcGVyLCBmaWxsID0gdGltZV9wb2ludCksIGFscGhhID0gMC40KSArCiAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gdGltZV9wb2ludCkpICsKICAgIGxhYnMoY29sb3I9IlRpbWUgUG9pbnQiLCBmaWxsPSJUaW1lIFBvaW50IikgKwogICAgeGxhYigicSIpICsgeWxhYihleHByZXNzaW9uKCIiXnEgKiBEKSkgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIHJvd3M9dmFycyhwb3B1bGF0aW9uKSwgc2NhbGVzPSJmcmVlIiwgZHJvcCA9IFQpCmRpdl9wb3AKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KZ2dzYXZlKHBsb3QgPSBkaXZfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3N1YmplY3RfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjcsIGhlaWdodCA9IDIwLCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRpdl9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfc3ViamVjdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyNywgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gZGl2X3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9zdWJqZWN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDI3LCBoZWlnaHQgPSAyMCwgdW5pdHM9ImNtIikKYGBgCgojIyMgQ2xvbmFsIGRpdmVyc2l0eSBwZXIgcG9wdWxhdGlvbiBhdCBzcGVjaWZpYyBxIHZhbHVlcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyMgcT0xIHstfQoKYGBge3IgY2xvbmFsX2RpdmVyc2l0eV9xMV9wb3AsIGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2Rpdl9xMSA8LSBzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHEgPT0gMSksXQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgYXQgcT0xIChOPSIsIHNhbXBsZV9kaXZfcG9wQG5bMV0sICIpIikKZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCmRxMV9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTEsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDEpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiAgICB4bGFiKCIiKSArIHlsYWIoIkRpdmVyc2l0eSAocT0xKSIpICsKICAgIGdndGl0bGUoc2FtcGxlX21haW4pICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIGRyb3A9VCwgc2NhbGVzID0gImZyZWUiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpkcTFfcG9wCmBgYAoKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExX3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMV90ZXN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNSwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkcTFfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2Rpdl9xMSRzdWJqX3BvcCA8LSBwYXN0ZShzYW1wbGVfZGl2X3ExJHBhdGllbnQsIHNhbXBsZV9kaXZfcTEkcG9wdWxhdGlvbiwgc2VwID0gIl8iKQoKc2FtcGxlX2Rpdl9xMSA8LSBzYW1wbGVfZGl2X3ExWyEoc2FtcGxlX2Rpdl9xMSRzYW1wbGVfcG9wICVpbiUgYygiQ2xhZHJpYmluXzEybW9udGhzX0NMQUQ0X04iLCJDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluX2Jhc2VsaW5lX0NMQUQ0X04iKSksXQoKIyAKIyBib3hwbG90X3BvcCA8LSBnZ3Bsb3Qoc2FtcGxlX2Rpdl9xMSwgYWVzKHk9ZCwgeD10aW1lX3BvaW50KSkgKwojICAgICBnZW9tX2JveHBsb3QoKSArCiMgICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDEpICsKIyAgICAgI2dlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiMgICAgIHhsYWIoIiIpICsgeWxhYigiRGl2ZXJzaXR5IChxPTEpIikgKwojICAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwojICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQojIGJveHBsb3RfcG9wCiMgCiMgZ2dzYXZlKHBsb3QgPSBib3hwbG90X3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMV90ZXN0X2JveHBsb3RfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAojICAgICAgICAgd2lkdGggPSAxNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKIyBnZ3NhdmUocGxvdCA9IGJveHBsb3RfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3RfYm94cGxvdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiMgICAgICAgICB3aWR0aCA9IDE1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQoKIyBCb3hwbG90IHdpdGggV2lsY294b24gcGFpcmVkIHRlc3RzIChnZ3B1YnIpCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmJveHBsb3RfZGl2cTEgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTEsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MSkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnkgPSAxMzAwKQoKYm94cGxvdF9kaXZxMQoKYm94cGxvdF9kaXZxMV9ub2tydXNrYWwgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTEsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MSkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKQpib3hwbG90X2RpdnExX25va3J1c2thbApgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShwbG90PWJveHBsb3RfZGl2cTEsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfcTFfc3Vial9wb3BfYm94cGxvdHMucG5nIiksIGRldmljZT0icG5nIiwgCiAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdD1ib3hwbG90X2RpdnExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3N1YmpfcG9wX2JveHBsb3RzLnBkZiIpLCBkZXZpY2U9InBkZiIsIAogICAgICAgd2lkdGg9MjAsIGhlaWdodD03LCB1bml0cz0iY20iKQpgYGAKCiMjIyMgcT0wIHstfQoKYGBge3IgY2xvbmFsX2RpdmVyc2l0eV9xMF9wb3AsIGZpZy53aWR0aD0xMCwgZmlnLmFzcCA9IDAuNiwgZWNobyA9IEZBTFNFfQpzYW1wbGVfZGl2X3EwIDwtIHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eVt3aGljaChzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcSA9PSAwKSxdCgoKc2FtcGxlX21haW4gPC0gcGFzdGUwKCJTYW1wbGUgZGl2ZXJzaXR5IGF0IHE9MCAoTj0iLCBzYW1wbGVfZGl2X3BvcEBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTBfcG9wIDwtIGdncGxvdChzYW1wbGVfZGl2X3EwLCBhZXMoeT1kLCB4PXRpbWVfcG9pbnQpKSArCiAgICBnZW9tX3BvaW50KHBvc2l0aW9uPWRvZGdlLCBzdGF0PSJpZGVudGl0eSIsIHNpemUgPSAxKSArCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4yLCBwb3NpdGlvbj1kb2RnZSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBmYWNldF9ncmlkKGNvbHM9dmFycyhwYXRpZW50KSwgcm93cz12YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKZHEwX3BvcApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHEwX3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNSwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkcTBfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLGVjaG8gPSBGQUxTRX0KIyBCb3hwbG90IHdpdGggV2lsY294b24gcGFpcmVkIHRlc3RzIChnZ3B1YnIpCnNhbXBsZV9kaXZfcTAgPC0gc2FtcGxlX2Rpdl9xMFshKHNhbXBsZV9kaXZfcTAkc2FtcGxlX3BvcCAlaW4lIGMoIkNsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiIsIkNsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIikpLF0KCm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmJveHBsb3RfZGl2cTAgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTAsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnk9MTMwMCkKYm94cGxvdF9kaXZxMAoKYm94cGxvdF9kaXZxMF9ub2tydXNrYWwgPC0gZ2dib3hwbG90KHNhbXBsZV9kaXZfcTAsIHggPSAidGltZV9wb2ludCIsIHkgPSAiZCIsCiAgICAgICAgYWRkID0gImppdHRlciIsIGxlZ2VuZCA9ICJub25lIiwKICAgICAgICAgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgZmFjZXQuYnkgPSAicG9wdWxhdGlvbiIsIG5jb2wgPSA0LCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICN0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICAgICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZCA9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIsIGhpZGUubnMgPSBUKQpib3hwbG90X2RpdnEwX25va3J1c2thbApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gYm94cGxvdF9kaXZxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3BvcHVsYXRpb25fYm94cGxvdC5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDcsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gYm94cGxvdF9kaXZxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3BvcHVsYXRpb25fYm94cGxvdC5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDcsIHVuaXRzPSJjbSIpCmBgYAoKIyMgRmlndXJlIGRpdmVyc2l0eSBhbmQgYWJ1bmRhbmNlIG1ldHJpY3MKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmFzcD0xLGVjaG8gPSBGQUxTRX0KYWxsX2JveHBsb3RzIDwtIGNvd3Bsb3Q6OnBsb3RfZ3JpZChib3hwbG90X2RpdnEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBib3hwbG90X2RpdnExLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfY2xvbmVfc2l6ZSwKICAgICAgICAgIGxhYmVscz1jKCJBIiwiQiIsIkMiKSwKICAgICAgICAgIG5jb2w9MSwKICAgICAgICAgIGFsaWduID0gVAogICAgICAgICAgKQphbGxfYm94cGxvdHMKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTYsIGVjaG89RiwgaW5jbHVkZT1GfQpnZ3NhdmUocGxvdCA9IGFsbF9ib3hwbG90cywgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90cy5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGFsbF9ib3hwbG90cywgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90cy5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmFzcD0wLjQsZWNobyA9IEZBTFNFfQphbGxfYm94cGxvdHNfc3VwcGwgPC0gcGxvdF9ncmlkKGJveHBsb3RfZ2luaSwKICAgICAgICAgIGxhYmVscz1jKCJBIiksCiAgICAgICAgICBuY29sPTEsCiAgICAgICAgICBhbGlnbiA9IFQKICAgICAgICAgICkKYWxsX2JveHBsb3RzX3N1cHBsCmBgYAoKYGBge3IsIGZpZy53aWR0aD02LCBlY2hvPUYsIGluY2x1ZGU9Rn0KZ2dzYXZlKHBsb3QgPSBhbGxfYm94cGxvdHNfc3VwcGwsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9GaWd1cmVfYWxsYm94cGxvdHNfc3VwcGwucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTcsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gYWxsX2JveHBsb3RzX3N1cHBsLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRmlndXJlX2FsbGJveHBsb3RzX3N1cHBsLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNywgdW5pdHM9ImNtIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5hc3A9MSxlY2hvID0gRkFMU0V9CmFsbF9ib3hwbG90c19ub2tydXNrYWwgPC0gcGxvdF9ncmlkKCAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfZGl2cTBfbm9rcnVza2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfZGl2cTFfbm9rcnVza2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJveHBsb3RfY2xvbmVfc2l6ZV9ub2tydXNrYWwsCiAgICAgICAgICBsYWJlbHM9YygiQSIsIkIiLCJDIiksCiAgICAgICAgICBuY29sPTEsCiAgICAgICAgICBhbGlnbiA9IFQKICAgICAgICAgICkKYWxsX2JveHBsb3RzX25va3J1c2thbApgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZWNobz1GLCBpbmNsdWRlPUZ9Cmdnc2F2ZShwbG90ID0gYWxsX2JveHBsb3RzX25va3J1c2thbCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90c19ub2tydXNrYWwucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNiwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBhbGxfYm94cGxvdHNfbm9rcnVza2FsLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRmlndXJlX2FsbGJveHBsb3RzX25va3J1c2thbC5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cz0iY20iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmFzcD0wLjQsZWNobyA9IEZBTFNFfQphbGxfYm94cGxvdHNfbm9rcnVza2FsX3N1cHBsIDwtIHBsb3RfZ3JpZChib3hwbG90X2dpbmlfbm9rcnVza2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBIiksCiAgICAgICAgICBuY29sPTEsCiAgICAgICAgICBhbGlnbiA9IFQKICAgICAgICAgICkKYWxsX2JveHBsb3RzX25va3J1c2thbF9zdXBwbApgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZWNobz1GLCBpbmNsdWRlPUZ9Cmdnc2F2ZShwbG90ID0gYWxsX2JveHBsb3RzX25va3J1c2thbF9zdXBwbCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0ZpZ3VyZV9hbGxib3hwbG90c19ub2tydXNrYWxfc3VwcGwucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGFsbF9ib3hwbG90c19ub2tydXNrYWwsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9GaWd1cmVfYWxsYm94cGxvdHNfbm9rcnVza2FsX3N1cHBsLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNywgdW5pdHM9ImNtIikKYGBgCgojIFYgZ2VuZSB1c2FnZQoKIyMgViBnZW5lIGZhbWlseSB1c2FnZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KClRoZSBWIGdlbmUgdXNhZ2UgKGluIHBlcmNlbnRhZ2UpIGluIGVhY2ggb2YgdGhlIHNhbXBsZXMgaXMgcmVwcmVzZW50ZWQgYmVsb3cuIEFsbCBwbG90cyBhbmQgdGFibGVzIGNhbiBiZSBmb3VuZCBbaGVyZV0oLi9yZXBlcnRvaXJlX2NvbXBhcmlzb24vVl9mYW1pbHkvKS4KCkdlbmUgZmFtaWx5IHVzYWdlIGlzIG5vcm1hbGl6ZWQgYnkgdGhlIG51bWJlciBvZiBjbG9uZXMuCgojIyMgQnkgcGF0aWVudCB7LX0KCmBgYHtyLCBlY2hvPUYsZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuMywgZmlnLmFsaWduPSdjZW50ZXInfQpmYW1pbHkgPC0gY291bnRHZW5lcyhkZl9hbGwsIGdlbmU9InZfY2FsbCIsIGdyb3Vwcz0ic2FtcGxlIiwgbW9kZT0iZmFtaWx5IiwgY2xvbmU9ImNsb25lX2lkIikKZmFtaWx5JHRyZWF0bWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmZhbWlseSR0aW1lX3BvaW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsyXSkKZmFtaWx5JHRpbWVfcG9pbnQgPC0gZmFjdG9yKGZhbWlseSR0aW1lX3BvaW50LCBsZXZlbHM9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKZmFtaWx5JHBhdGllbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQoKCmdnMSA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoZmlsbD1nZW5lLCB5PWNsb25lX2ZyZXEsIHg9dGltZV9wb2ludCkpICsKICAgICAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKwogICAgICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocGF0aWVudCksIGRyb3A9VCwgc2NhbGVzID0gImZyZWUiICkgKwogICAgICAgICAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpKQoKCiMgZzIgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9dGltZV9wb2ludCwgeT1jbG9uZV9mcmVxLCBmaWxsPXRpbWVfcG9pbnQpKSArCiMgICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiMgICAgIGdndGl0bGUoIlYgR2VuZSBGYW1pbHkgVXNhZ2UiKSArCiMgICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKIyAgICAgeWxhYigiRnJlcXVlbmN5IikgKwojICAgICB4bGFiKCIiKSArCiMgICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocGF0aWVudCksIHJvd3M9dmFycyhnZW5lKSxkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKIyAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiMgICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IkJsdWVzIikKZ2cxCiNnMgpgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudC5zdmciKSwgcGxvdCA9IGdnMSwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNiwgdW5pdHMgPSAiY20iKQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnQucG5nIiksIHBsb3QgPSBnZzEsIHdpZHRoID0gMjAsIGhlaWdodCA9IDYsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZmFtaWx5X2Rpc3RyaWJ1dGlvbl9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKYGBge3IsIGVjaG89RixmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCiMgZzMgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9dGltZV9wb2ludCwgeT1jbG9uZV9mcmVxKSkgKwojICAgICBnZW9tX3BvaW50KHBvc2l0aW9uID1kb2RnZSwgc3RhdD0iaWRlbnRpdHkiLCBzaXplPTEpICsKIyAgICAgZ2VvbV9ib3hwbG90KCkgKwojICAgICAjZ2VvbV9saW5lKGFlcyhncm91cD1wYXRpZW50LGNvbG9yPXBhdGllbnQpKSArCiMgICAgIGdndGl0bGUoIlYgR2VuZSBGYW1pbHkgVXNhZ2UiKSArCiMgICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKIyAgICAgeWxhYigiRnJlcXVlbmN5IikgKwojICAgICB4bGFiKCIiKSArCiMgICAgIGZhY2V0X2dyaWQoY29scz12YXJzKGdlbmUpLGRyb3A9VCwgc2NhbGVzID0gImZyZWUiICkgCiMgICAgICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKIyAgICAgI3NjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZT0iQWNjZW50IikKIyBnMwoKCnZnZW5lX2JveHBsb3QgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoZmFtaWx5LCB4PSJ0aW1lX3BvaW50IiwgeT0iY2xvbmVfZnJlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCBsZWdlbmQ9Im5vbmUiLCBjb2xvciA9ICJ0aW1lX3BvaW50IiwgbGluZS5jb2xvciA9ICJncmF5IiwgbGluZS5zaXplID0gMC40LAogICAgICAgICAgICAgICAgICAgICAgICBmYWNldC5ieSA9ICJnZW5lIiwgbnJvdyA9IDEsIHNob3J0LnBhbmVsLmxhYnMgPSBUKSArCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICAgICAgICAgICAgICAgeGxhYigiIikgKyB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICAgICAgICAgICAgICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiKSArCiAgICAgICAgICAgICAgICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkPVQsIGxhYmVsPSJwLmZvcm1hdCIsIGxhYmVsLnkgPSAwLjkpCnZnZW5lX2JveHBsb3QKCmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKHBsb3QgPSB2Z2VuZV9ib3hwbG90LCBmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwiL1ZfRmFtaWx5X2Rpc3RyaWJ1dGlvbl9wYXRpZW50X2JveHBsb3QucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA3LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IHZnZW5lX2JveHBsb3QsIGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfYm94cGxvdC5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDcsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIEJ5IFBvcHVsYXRpb24gey19CgpgYGB7ciwgZWNobz1GLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC44LCBmaWcuYWxpZ249J2NlbnRlcid9CmZhbWlseV9wb3AgPC0gY291bnRHZW5lcyhkZl9hbGwsIGdlbmU9InZfY2FsbCIsIGdyb3Vwcz0ic2FtcGxlX3BvcCIsCiAgICAgICAgICAgICAgICAgICAgbW9kZT0iZmFtaWx5IiwgY2xvbmUgPSAiY2xvbmVfaWQiKQpmYW1pbHlfcG9wJHRyZWF0bWVudCA8LSBzYXBwbHkoZmFtaWx5X3BvcCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKZmFtaWx5X3BvcCR0aW1lX3BvaW50IDwtIHNhcHBseShmYW1pbHlfcG9wJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHlfcG9wJHBhdGllbnQgPC0gc2FwcGx5KGZhbWlseV9wb3Akc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmZhbWlseV9wb3AkcG9wdWxhdGlvbiA8LSBzYXBwbHkoZmFtaWx5X3BvcCRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVs0XSkKZmFtaWx5X3BvcCR0aW1lX3BvaW50IDwtIGZhY3RvcihmYW1pbHlfcG9wJHRpbWVfcG9pbnQsIGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpmYW1pbHlfcG9wJHBvcHVsYXRpb24gPC0gZmFjdG9yKGZhbWlseV9wb3AkcG9wdWxhdGlvbiwgbGV2ZWxzPWMoIk4iLCJNIiwiRE4iLCJQIikpCgoKZ2cxIDwtIGdncGxvdChmYW1pbHlfcG9wLCBhZXMoZmlsbD1nZW5lLCB5PWNsb25lX2ZyZXEsIHg9dGltZV9wb2ludCkpICsKICAgICAgICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIsIHN0YXQ9ImlkZW50aXR5IikgKwogICAgICAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMocGF0aWVudCksIHJvd3MgPSB2YXJzKHBvcHVsYXRpb24pLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpICsKICAgICAgICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1ZW5jeSIpCgpnZzEKCmBgYAoKYGBge3IsIGVjaG8gPSBGfQpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudF9wb3B1bGF0aW9uLnN2ZyIpLCBwbG90ID0gZ2cxLAogICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTYsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfcG9wdWxhdGlvbi5wbmciKSwgcGxvdCA9IGdnMSwKICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE2LCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwiL1ZfRmFtaWx5X2Rpc3RyaWJ1dGlvbl9wYXRpZW50X3BvcHVsYXRpb24ucGRmIiksIHBsb3QgPSBnZzEsCiAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNiwgdW5pdHMgPSAiY20iKQp3cml0ZS50YWJsZShmYW1pbHksIGZpbGUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9mYW1pbHlfZGlzdHJpYnV0aW9uX2RhdGFfcG9wdWxhdGlvbi50c3YiKSwgc2VwID0gIlx0IiwKICAgIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgpgYGB7ciwgZWNobz1GLGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLCBmaWcuYWxpZ249J2NlbnRlcid9CiNmYW1pbHlfcG9wX20gPC0gZmFtaWx5X3BvcFsoZmFtaWx5X3BvcCRwb3B1bGF0aW9uPT0iTSIpLF0KCmZhbWlseV9wb3AgPC0gZmFtaWx5X3BvcFshKGZhbWlseV9wb3Akc2FtcGxlX3BvcCAlaW4lIGMoIkNsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiIsIkNsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIikpLF0KCiMgZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCiMgZzMgPC0gZ2dwbG90KGZhbWlseV9wb3AsIGFlcyh4PXRpbWVfcG9pbnQsIHk9Y2xvbmVfZnJlcSkpICsKIyAgICAgICBnZW9tX2JveHBsb3QoKSArCiMgICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZT0xKSArCiMgCiMgICAgICNnZW9tX2xpbmUoYWVzKGdyb3VwPXBhdGllbnQsY29sb3I9cGF0aWVudCkpICsKIyAgICAgZ2d0aXRsZSgiViBHZW5lIEZhbWlseSBVc2FnZSIpICsKIyAgICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwojICAgICB5bGFiKCJGcmVxdWVuY3kiKSArCiMgICAgIHhsYWIoIiIpICsKIyAgICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoZ2VuZSksIHJvd3M9dmFycyhwb3B1bGF0aW9uKSwgZHJvcD1ULCBzY2FsZXMgPSAiZnJlZSIgKSAKIyAgICAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwojICAgICAjc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlPSJBY2NlbnQiKQojIGczCgpteV9jb21wYXJpc29ucyA8LSBsaXN0KCBjKCJiYXNlbGluZSIsICI2bW9udGhzIiksIGMoIjZtb250aHMiLCAiMTJtb250aHMiKSwgYygiYmFzZWxpbmUiLCAiMTJtb250aHMiKSApCgojIFJlbW92ZSBJR0hWNyBhcyBubyBwcmltZXJzIHdlcmUgaW5jbHVkZWQgZm9yIHRoaXMgZ2VuZToKZmFtaWx5X3BvcCA8LSBmYW1pbHlfcG9wICU+JSBmaWx0ZXIoZ2VuZSAhPSAiSUdIVjciKQoKdmdlbmVfYm94cGxvdF9wb3AgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoZmFtaWx5X3BvcCwgeD0idGltZV9wb2ludCIsIHk9ImNsb25lX2ZyZXEiLAogICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgbGVnZW5kPSJub25lIiwgY29sb3IgPSAidGltZV9wb2ludCIsIGxpbmUuY29sb3IgPSAiZ3JheSIsIGxpbmUuc2l6ZSA9IDAuNCwKICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSBjKCJwb3B1bGF0aW9uIiwiZ2VuZSIpLCBzaG9ydC5wYW5lbC5sYWJzID0gVCkgKwogICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpICsKICAgICAgICAgICAgICAgICAgICAgIHhsYWIoIiIpICsgeWxhYigiRnJlcXVlbmN5IikgKwogICAgICAgICAgICAgICAgICAgICAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIHBhaXJlZD1ULCBtZXRob2QgPSAid2lsY294IiwgbGFiZWw9InAuc2lnbmlmIiwgaGlkZS5ucyA9IFQpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQ9VCwgbGFiZWw9InAuZm9ybWF0IiwgbGFiZWwueSA9IDEuMSwgaGlkZS5ucyA9IFQpCnZnZW5lX2JveHBsb3RfcG9wCgpgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShwbG90ID0gdmdlbmVfYm94cGxvdF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9nZW5lX2ZhbWlseV91c2FnZV9ib3hwbG90X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTIwLCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IHZnZW5lX2JveHBsb3RfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwiL1ZfZ2VuZV9mYW1pbHlfdXNhZ2VfYm94cGxvdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0yMCwgdW5pdHM9ImNtIikKCmBgYAoKIyMgViBnZW5lIHVzYWdlIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKVGhlIFYgZ2VuZSB1c2FnZSAoaW4gcGVyY2VudGFnZSkgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcyBpcyByZXByZXNlbnRlZCBiZWxvdy4KQWxsIHBsb3RzIGFuZCB0YWJsZXMgY2FuIGJlIGZvdW5kIFtoZXJlXSguL3JlcGVydG9pcmVfY29tcGFyaXNvbi9WX2ZhbWlseS8pLgoKIyMjIEJ5IGNsb25lcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiLCBjbG9uZSA9ICJjbG9uZV9pZCIpCmZhbWlseSR0cmVhdG1lbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmZhbWlseSRwYXRpZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKZzIgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9Z2VuZSwgeT1jbG9uZV9mcmVxLCBmaWxsPWdlbmUpKSArCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZ3RpdGxlKCJWIEdlbmUgRmFtaWx5IFVzYWdlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwogICAgeWxhYigiRnJlcXVlbmN5IikgKwogICAgeGxhYigiIikgKwogICAgZmFjZXRfd3JhcCh2YXJzKHBhdGllbnQpLCBzY2FsZXM9ImZyZWVfeCIsIG5jb2wgPSAxKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmcyCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X2Nsb25lX3BhdGllbnQuc3ZnIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfY2xvbmVfcGF0aWVudC5wbmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDIwLCBoZWlnaHQgPSA0MCwgdW5pdHMgPSAiY20iKQp3cml0ZS50YWJsZShmYW1pbHksIGZpbGUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9jbG9uZV9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKIyMjIEJ5IHNlcXVlbmNlcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiKQpmYW1pbHkkdHJlYXRtZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKZmFtaWx5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHkkcGF0aWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmcyIDwtIGdncGxvdChmYW1pbHksIGFlcyh4PWdlbmUsIHk9c2VxX2ZyZXEsIGZpbGw9Z2VuZSkpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgIGdndGl0bGUoIlYgR2VuZSBVc2FnZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKICAgIHlsYWIoIkZyZXF1ZW5jeSIpICsKICAgIHhsYWIoIiIpICsKICAgIGZhY2V0X3dyYXAodmFycyhwYXRpZW50KSwgc2NhbGVzPSJmcmVlX3giLCBuY29sID0gMSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpnMgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9zZXF1ZW5jZV9wYXRpZW50LnN2ZyIpLCBwbG90ID0gZzIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X3NlcXVlbmNlX3BhdGllbnQucG5nIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfc2VxdWVuY2VfZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMgSXNvdHlwZSB1c2FnZQoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgc3ViamVjdAoKYGBge3IgaXNvdHlwZV91c2FnZSwgZWNobz1GLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgUGxvdHRpbmcgSXNvdHlwZSBwZXJjZW50YWdlcyBwZXIgcGF0aWVudApkZl9hbGwkaXNvdHlwZSA8LSBkZl9hbGwkY19wcmltZXIKCnJlcyA8LSBkZl9hbGwgJT4lIGdyb3VwX2J5KGlzb3R5cGUsc2FtcGxlLHNvdXJjZSx0cmVhdG1lbnQsZXh0cmFjdF90aW1lKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX2lzb3R5cGU9bigpKQpyZXMgPC0gd2l0aChyZXMsIHJlc1tvcmRlcihzb3VyY2UpLF0pCnJlc19zYW1wbGUgPC0gZGZfYWxsICU+JSBncm91cF9ieShzYW1wbGUpICU+JSBkcGx5cjo6c3VtbWFyaXNlKFNlcXNfdG90YWw9bigpKQoKZnJlcXMgPC0gbWVyZ2UoeD1yZXMsIHk9cmVzX3NhbXBsZSwgYWxsLnggPSBULCBieS54ID0gInNhbXBsZSIsIGJ5LnkgPSAic2FtcGxlIikKZnJlcXMkRnJlcSA8LSAoZnJlcXMkU2Vxc19pc290eXBlL2ZyZXFzJFNlcXNfdG90YWwpCmZyZXFzJGV4dHJhY3RfdGltZSA8LSBmYWN0b3IoZnJlcXMkZXh0cmFjdF90aW1lLCBsZXZlbHM9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKCiMgZzQgPC0gZ2dwbG90KGZyZXFzLCBhZXMoZmlsbD1leHRyYWN0X3RpbWUsIHk9RnJlcSwgeD1pc290eXBlKSkgKwojICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoIkZyZXF1ZW5jeSIpICsKIyAgIGdndGl0bGUoIklzb3R5cGUgZnJlcXVlbmN5IikgKwojICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoc291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwojICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKIyBnNAoKZzQgPC0gZ2dwbG90KGZyZXFzLCBhZXMoZmlsbD1pc290eXBlLCB5PUZyZXEsIHg9ZXh0cmFjdF90aW1lKSkgKwogICAgICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICAgICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzb3VyY2UpLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkKZzQKYGBgCgpgYGB7ciwgZWNobz1GfQpnZ3NhdmUocGxvdD1nNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX2ZyZXF1ZW5jaWVzX3BhdGllbnQuc3ZnIiksIGRldmljZSA9ICJzdmciLAogIHdpZHRoID0gMjAsIGhlaWdodCA9IDYsIHVuaXRzID0gImNtIikKZ2dzYXZlKHBsb3Q9ZzQsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19wYXRpZW50LnBkZiIpLCBkZXZpY2UgPSAicGRmIiwKICB3aWR0aCA9IDIwLCBoZWlnaHQgPSA2LCB1bml0cyA9ICJjbSIpCndyaXRlLnRhYmxlKGZyZXFzLCBmaWxlID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19kYXRhLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGU9Riwgcm93Lm5hbWVzID0gRikKCmBgYAoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgY2VsbCBwb3B1bGF0aW9uCgpgYGB7ciBpc290eXBlX3BvcCwgZWNobz1GLCBmaWcud2lkdGg9MTUsIGZpZy5hc3A9MC42LCBmaWcuYWxpZ249J2NlbnRlcid9CmRmX2FsbCRpc290eXBlIDwtIGRmX2FsbCRjX3ByaW1lcgpyZXNfcG9wIDwtIGRmX2FsbCAlPiUgZ3JvdXBfYnkoaXNvdHlwZSwgc2FtcGxlX3BvcCwgc291cmNlLCB0cmVhdG1lbnQsIGV4dHJhY3RfdGltZSwgcG9wdWxhdGlvbikgJT4lIGRwbHlyOjpzdW1tYXJpc2UoU2Vxc19pc290eXBlPW4oKSkKcmVzX3BvcCA8LSB3aXRoKHJlc19wb3AsIHJlc19wb3Bbb3JkZXIoc291cmNlKSxdKQpyZXNfcG9wX3NhbXBsZSA8LSBkZl9hbGwgJT4lIGdyb3VwX2J5KHNhbXBsZV9wb3ApICU+JSBkcGx5cjo6c3VtbWFyaXNlKFNlcXNfdG90YWw9bigpKQoKZnJlcXMgPC0gbWVyZ2UoeD1yZXNfcG9wLCB5PXJlc19wb3Bfc2FtcGxlLCBhbGwueCA9IFQsIGJ5LnggPSAic2FtcGxlX3BvcCIsIGJ5LnkgPSAic2FtcGxlX3BvcCIpCmZyZXFzJEZyZXEgPC0gKGZyZXFzJFNlcXNfaXNvdHlwZS9mcmVxcyRTZXFzX3RvdGFsKQpmcmVxcyRleHRyYWN0X3RpbWUgPC0gZmFjdG9yKGZyZXFzJGV4dHJhY3RfdGltZSwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCmZyZXFzJHBvcHVsYXRpb24gPC0gZmFjdG9yKGZyZXFzJHBvcHVsYXRpb24sIGxldmVscz1jKCJOIiwgIk0iLCAiRE4iLCAiUCIpKQojIGc0IDwtIGdncGxvdChmcmVxcywgYWVzKGZpbGw9ZXh0cmFjdF90aW1lLCB5PUZyZXEsIHg9aXNvdHlwZSkpICsKIyAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKIyAgeGxhYigiIikgKwojICB5bGFiKCJGcmVxdWVuY3kiKSArCiMgIGdndGl0bGUoIklzb3R5cGUgZnJlcXVlbmN5IikgKwojICBmYWNldF9ncmlkKGNvbHM9dmFycyhzb3VyY2UpLCByb3dzPXZhcnMocG9wdWxhdGlvbikpICsKIyAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKIyBnNAoKZzQgPC0gZ2dwbG90KGZyZXFzLCBhZXMoZmlsbD1pc290eXBlLCB5PUZyZXEsIHg9ZXh0cmFjdF90aW1lKSkgKwogICAgICAgIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICAgICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzb3VyY2UpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksZHJvcD1ULCBzY2FsZXMgPSAiZnJlZSIgKSArCiAgICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkIiLCAiNk0iLCAiMTJNIikpCmc0CmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKGc0LCBmaWxlbmFtZSA9IHBhc3RlMChpc290eXBlX2RpciwiL0lzb3R5cGVfcGVyY2VudGFnZXNfY2VsbF9wb3B1bGF0aW9uLnN2ZyIpLCBkZXZpY2UgPSAic3ZnIiwKICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNCwgdW5pdHMgPSAiY20iKQpnZ3NhdmUoZzQsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9wZXJjZW50YWdlc19jZWxsX3BvcHVsYXRpb24ucGRmIiksIGRldmljZSA9ICJwZGYiLAogIHdpZHRoID0gMjAsIGhlaWdodCA9IDE0LCB1bml0cyA9ICJjbSIpCmdnc2F2ZShnNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX3BlcmNlbnRhZ2VzX2NlbGxfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlID0gInBuZyIsCiAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTQsIHVuaXRzID0gImNtIikKCndyaXRlLnRhYmxlKGZyZXFzLCBmaWxlID0gcGFzdGUwKGlzb3R5cGVfZGlyLCAiL0lzb3R5cGVfZnJlcXVlbmNpZXNfY2VsbF9wb3B1bGF0aW9uX2RhdGEudHN2IiksIHNlcD0iXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKYGBge3IsIGVjaG89RiwgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTF9Cm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoImJhc2VsaW5lIiwgIjZtb250aHMiKSwgYygiNm1vbnRocyIsICIxMm1vbnRocyIpLCBjKCJiYXNlbGluZSIsICIxMm1vbnRocyIpICkKCmZyZXFzIDwtIGZyZXFzWyEoZnJlcXMkc2FtcGxlX3BvcCAlaW4lIGMoIkNsYWRyaWJpbl8xMm1vbnRoc19DTEFENF9OIiwiQ2xhZHJpYmluXzZtb250aHNfQ0xBRDRfTiIsIkNsYWRyaWJpbl9iYXNlbGluZV9DTEFENF9OIikpLF0KCmlzb3R5cGVfYm94cGxvdF9wb3AgPC0gZ2dwdWJyOjpnZ2JveHBsb3QoZnJlcXMsIHg9ImV4dHJhY3RfdGltZSIsIHk9IkZyZXEiLAogICAgICAgICAgICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgbGVnZW5kPSJub25lIiwgY29sb3IgPSAiZXh0cmFjdF90aW1lIiwgbGluZS5jb2xvciA9ICJncmF5IiwgbGluZS5zaXplID0gMC40LAogICAgICAgICAgICAgICAgICAgICAgICBmYWNldC5ieSA9IGMoInBvcHVsYXRpb24iLCJpc290eXBlIiksIHNob3J0LnBhbmVsLmxhYnMgPSBUKSArCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIiksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQiIsICI2TSIsICIxMk0iKSkgKwogICAgICAgICAgICAgICAgICAgICAgeGxhYigiIikgKyB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICAgICAgICAgICAgICAgICAgICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkPVQsIG1ldGhvZCA9ICJ3aWxjb3giLCBsYWJlbD0icC5zaWduaWYiLCBoaWRlLm5zPVQpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQ9VCwgbGFiZWw9InAuZm9ybWF0IiwgbGFiZWwueSA9IDEuNCwgaGlkZS5ucyA9IFQpCmlzb3R5cGVfYm94cGxvdF9wb3AKYGBgCgpgYGB7ciwgZWNobz1GfQpnZ3NhdmUocGxvdCA9IGlzb3R5cGVfYm94cGxvdF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV91c2FnZV9ib3hwbG90X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTIwLCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGlzb3R5cGVfYm94cGxvdF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV91c2FnZV9ib3hwbG90X3BvcHVsYXRpb24ucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPTIwLCB1bml0cz0iY20iKQoKYGBgCgpgYGB7ciwgZWNobz1GLGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjMsIGZpZy5hbGlnbj0nY2VudGVyJ30KaXNvdHlwZV9wb3BfbSA8LSBmcmVxc1soZnJlcXMkcG9wdWxhdGlvbj09Ik0iKSxdCgppc290eXBlX2JveHBsb3RfcG9wX20gPC0gZ2dwdWJyOjpnZ2JveHBsb3QoaXNvdHlwZV9wb3BfbSwgeD0iZXh0cmFjdF90aW1lIiwgeT0iRnJlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCBsZWdlbmQ9Im5vbmUiLCBjb2xvciA9ICJleHRyYWN0X3RpbWUiLCBsaW5lLmNvbG9yID0gImdyYXkiLCBsaW5lLnNpemUgPSAwLjQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0LmJ5ID0gYygicG9wdWxhdGlvbiIsImlzb3R5cGUiKSwgc2hvcnQucGFuZWwubGFicyA9IFQpICsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3M9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCIiwgIjZNIiwgIjEyTSIpKSArCiAgICAgICAgICAgICAgICAgICAgICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1ZW5jeSIpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBwYWlyZWQ9VCwgbWV0aG9kID0gIndpbGNveCIsIGxhYmVsPSJwLnNpZ25pZiIpICsKICAgICAgICAgICAgICAgICAgICAgIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQ9VCwgbGFiZWw9InAuZm9ybWF0IiwgbGFiZWwueSA9IDEuNCkKaXNvdHlwZV9ib3hwbG90X3BvcF9tCmBgYAoKYGBge3IsIGVjaG89Rn0KZ2dzYXZlKHBsb3QgPSBpc290eXBlX2JveHBsb3RfcG9wX20sIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV91c2FnZV9ib3hwbG90X01fcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMTUsIGhlaWdodCA9IDYsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gaXNvdHlwZV9ib3hwbG90X3BvcF9tLCBmaWxlbmFtZSA9IHBhc3RlMChpc290eXBlX2RpciwiL0lzb3R5cGVfdXNhZ2VfYm94cGxvdF9NX3BvcHVsYXRpb24ucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDE1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpgYGAKCgoKCiMgQ2l0YXRpb25zCgpJZiB5b3UgdXNlIG5mLWNvcmUvYmNlbGxtYWdpYyBmb3IgeW91ciBhbmFseXNpcywgcGxlYXNlIGNpdGUgaXQgdXNpbmcgdGhlIGZvbGxvd2luZyBET0k6IFsxMC41MjgxL3plbm9kby4zNjA3NDA4XShodHRwczovL2RvaS5vcmcvMTAuNTI4MS96ZW5vZG8uMzYwNzQwOCkKClBsZWFzZSBhbHNvIGNpdGUgdGhlIGBuZi1jb3JlYCBwdWJsaWNhdGlvbiBbQGV3ZWxzMjAyMF0uCgpJbiBhZGRpdGlvbiwgY2l0YXRpb25zIGZvciB0aGUgdG9vbHMgYW5kIGRhdGEgdXNlZCBpbiB0aGlzIHBpcGVsaW5lIGFyZSBhcyBmb2xsb3dzOgoKKiAqKnBSRVNUTyoqIFtAVmFuZGVySGVpZGVuMjAxNF0KKiAqKlNIYXphTSwgQ2hhbmdlLU8qKiBbQEd1cHRhMjAxNV0KKiAqKkFsYWthemFtKiogW0BTdGVybjIwMTRdCiogKipUSWdHRVIqKiBbQEdhZGFsYS1NYXJpYTIwMTVdCiogKipGYXN0UUMqKiBbQGFuZHJld3MyMDEwXQoqICoqTXVsdGlRQyoqIFtAZXdlbHMyMDE2XQo=